利用乙個陣列的資料來過濾另乙個陣列

2021-06-21 04:27:32 字數 1309 閱讀 1751

作者  yoyokko

原帖位址  

一般來說這種情況還是蠻多的,比如你從檔案中讀入了乙個array1,然後想把程式中的乙個array2中符合array1中內容的元素過濾出來。

正 常傻瓜一點就是兩個for迴圈,乙個乙個進行比較,這樣效率不高,而且**也不好看。

其實乙個迴圈或者無需迴圈就可以搞定了,那就需要用搞 nspredicate這個類了~膜拜此類~

1)例子一,乙個迴圈

nsarray

*arrayfilter = [

nsarray

arraywithobjects

:@"pict"

, @"blackrain"

, @"ip"

, nil];

nsarray *arraycontents = [nsarray arraywithobjects:@"i am a picture.", @"i am a guy", @"i am gagaga", @"ipad", @"iphone", nil];

我想過濾arraycontents的話只要迴圈 arrayfilter就好了

int i = 0, count = [arrayfilter count];

for(i = 0; i < count; i ++)

當然以上**中arraycontent最好用mutable 的,這樣就可以直接filter了,nsarray是不可修改的。

2)例子二,無需迴圈(暫未測試,有警告)

nsarray *arrayfilter = [nsarray arraywithobjects:@"abc1", @"abc2", nil];

nsarray *arraycontent = [nsarray arraywithobjects:@"a1", @"abc1", @"abc4", @"abc2", nil];

nspredicate *thepredicate = [nspredicate predicatewithformat:@"not (self in %@)", arrayfilter];

[arraycontent filterusingpredicate:thepredicate];

這樣arraycontent過濾出來的就是不包含 arrayfilter中的所有item了。

總結:1) 當使用聚合類的操作符時是可以不需要迴圈的

2)當使用單個比較類的操作符時可以乙個迴圈來搞定

ps,例子 一中嘗試使用[@"self contains %@", arrayfilter] 來過濾會掛調,因為contains時字串比較操作符,不是集合操作符。

判斷乙個陣列是否包含另乙個陣列

function iscontainarr parent,child let parent 1,2,3,6,5,4 let child 1,3,4,6 let child2 1,3,4,6,7 console.log iscontainarr parent,child true console.lo...

乙個陣列插入另乙個陣列引入的思考

今天在群裡有人丟擲了個問題 如何把 0,1,4 2,3 0,1,2,3,4 首先想到的是查下api有沒有相關的。於是找到了個 splice。splice的用法是 arrayobj.splice start,deletecount,item1 item2 itemn 引數是很多很多的引數,如item1...

js 陣列巢狀另乙個陣列

最近實現乙個功能,需要在js中在乙個陣列中巢狀另乙個陣列,即把arr1和arr2插入arr中,使得arr從變為arr n1 n2 n3 n4 n5 n6 如下所示 var arr1 n1 n2 n3 var arr2 n4 n5 n6 var arr arr n1 n2 n3 n4 n5 n6 由於...