Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Filter array by indices

Tags:

ios

swift

I have an array of elements. I also have an IndexSet that specifies which indices of the array need to be extracted into a new array. E.g.:

let array = ["sun", "moon", "star", "meteor"]
let indexSet: IndexSet = [2, 3]
// Some magic happens here to get:
let result = ["star", "meteor"]

I'm looking to use the swift filter function, but haven't got the answer yet. How can I do this?

like image 954
Tometoyou Avatar asked Oct 26 '16 14:10

Tometoyou


People also ask

How do you filter an array according to index?

Here's the syntax for Array Filter: const returnValue = array. filter((value, index, array) => {...}, thisArg); Our returnValue will contain our new array of filtered return values.

How do you filter an array of objects by value?

One can use filter() function in JavaScript to filter the object array based on attributes. The filter() function will return a new array containing all the array elements that pass the given condition. If no elements pass the condition it returns an empty array.

How do you filter an array of objects by key?

You can use the Object. keys() function to convert the object's keys into an array, and accumulate the filtered keys into a new object using the reduce() function as shown below. const obj = { firstName: 'Jean-Luc', lastName: 'Picard', age: 59 }; // { firstName: 'Jean-Luc', lastName: 'Picard' } Object.


2 Answers

IndexSet is a collection of increasing integers, therefore you can map each index to the corresponding array element:

let array = ["sun", "moon", "star", "meteor"]
let indexSet: IndexSet = [2, 3]

let result = indexSet.map { array[$0] } // Magic happening here!
print(result) // ["star", "meteor"]

This assumes that all indices are valid for the given array. If that is not guaranteed then you can filter the indices (as @dfri correctly remarked):

let result = indexSet.filteredIndexSet { $0 < array.count }.map { array[$0] }
like image 116
Martin R Avatar answered Oct 03 '22 07:10

Martin R


You can use enumerated, filter and map like this

let result = array
    .enumerated()
    .filter { indexSet.contains($0.offset) }
    .map { $0.element }
like image 42
Luca Angeletti Avatar answered Oct 03 '22 05:10

Luca Angeletti