2017-09-11 15 views
0

データ配列内の特定のインデックス位置を処理する必要があるかどうかを示すtrueとfalseのfiltersという配列があります。スウィフトではどのように機能するのですか?

機能アプローチ(map/filter/reduce)を使用して次のようにしますか?

var targetData: [String] = [] 
for i in 0..<filters.count where filters[i] { 
    targetData.append(data[i]) 
} 
+0

トランスフォーム(または最初の場所でそのようにそれをモデル化)しない限り、あるように、これはおそらく明確であるデータfilter' 'により適しものに。 – pvg

答えて

4

は、たとえば、多くの可能性があります。接続された2つの配列を処理するための最も簡単な方法は、1列にマージすることです

let filteredData = zip(filters, data) 
    .filter { (shouldKeep, _) in shouldKeep } 
    .map { (_, item) in item } 

または

let filteredData = zip(filters, data) 
    .filter { $0.0 } 
    .map { $0.1 } 

注こと。

+1

私は 'add '(動詞)ではなく' shouldKeep'(名詞、名詞句)のようなより良い名前を与えたいと思います。また、クロージャーの括弧を省略することもできます – Alexander

+0

'map'と' filter'を 'flatMap'に組み合わせることができます。 –

0

data.enumerated()に、次にmapを使用して、オフセットなしでフィルタリングされた要素を戻すことができます。

let originalData = ["a", "b", "c", "d"] 
let filters = [true, false, false, true] 
let filteredData = originalData 
         .enumerated() 
         .filter{ offset, _ in filters[offset] } 
         .map{ $0.element } 
print(filteredData) // ["a","d"] 

またはzipを使用して:

let newFilteredData = zip(originalData, filters).filter({ data, keepIt in keepIt}).map{$0.0} 
+0

ジップはより良いアプローチになります – Alexander

+0

私の答えを更新しました。 –

関連する問題