データ配列内の特定のインデックス位置を処理する必要があるかどうかを示すtrueとfalseのfiltersという配列があります。スウィフトではどのように機能するのですか?
機能アプローチ(map/filter/reduce)を使用して次のようにしますか?
var targetData: [String] = []
for i in 0..<filters.count where filters[i] {
targetData.append(data[i])
}
データ配列内の特定のインデックス位置を処理する必要があるかどうかを示すtrueとfalseのfiltersという配列があります。スウィフトではどのように機能するのですか?
機能アプローチ(map/filter/reduce)を使用して次のようにしますか?
var targetData: [String] = []
for i in 0..<filters.count where filters[i] {
targetData.append(data[i])
}
は、たとえば、多くの可能性があります。接続された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 }
注こと。
私は 'add '(動詞)ではなく' shouldKeep'(名詞、名詞句)のようなより良い名前を与えたいと思います。また、クロージャーの括弧を省略することもできます – Alexander
'map'と' filter'を 'flatMap'に組み合わせることができます。 –
を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}
ジップはより良いアプローチになります – Alexander
私の答えを更新しました。 –
トランスフォーム(または最初の場所でそのようにそれをモデル化)しない限り、あるように、これはおそらく明確であるデータfilter' 'により適しものに。 – pvg