28

I have a set of two arrays. One contains some fruit values as strings, the other one contains some random numbers. Here I considered the number arrays are the indexes of the fruits array. How to get a new array of fruits given the numbers in the index array?

Sample code:

var resultArr = [];
var fruitier = ["apple", "orange", "grapes", "pineapple", "fig", "banana", "jackfruit", "pomegranate"];
var indexArr = [0, 2, 4];

Output:

resultArr = ["apple", "grapes", "fig"];
0

6 Answers 6

61

Use .map:

let resultArr = indexArr.map(i => fruitier[i])
Sign up to request clarification or add additional context in comments.

Comments

12

If you want to achieve that with lodash, use _.at():

var fruitier = ['apple', 'orange', 'grapes', 'pineapple', 'fig', 'banana', 'jackfruit', 'pomegranate'];
var indexArr = [0, 2, 4];
var resultArr = _.at(fruitier, indexArr);

console.log(resultArr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.min.js"></script>

1 Comment

Just be aware that if you use flow type, it will complain because _.at() expects the first argument to be of Object, not Array. I think it's fine to ignore it using // $FlowFixMe
5
for(var i = 0; i < indexArr.length; i++)
  resultArr.push(fruitier[indexArr[i]]);

Comments

1

Array#map works (documentation)

const getFromIndex = (array, indexes) => indexes.map((index) => array[index]);

You can use Array#filter too (documentation)

const fruitier = ['apple', 'orange', 'grapes', 'pineapple', 'fig',   'banana', 'jackfruit', 'pomegranate'];
const indexArr = [0, 2, 4];  

const getFromIndex = (array, indexes) => {
  return array.filter((element, index) => indexes.includes(index)); 
};

Or also Array#reduce (documentation)

const getFromIndex = (array, indexes) => {
    return indexes.reduce((result, i) => result.concat(array[i]), []); 
};

Comments

1

Use lodash pullAt

var fruitier = ["apple", "orange", "grapes", "pineapple", "fig", "banana", 
"jackfruit", "pomegranate"];
var indexArr = [0, 2, 4];
var resultArr = _.pullAt(fruitier, indexArr);
console.log(resultArr);
// ["apple", "grapes", "fig"]

<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>

Key difference to be aware of alongside the above recommendation for _.at() is - this method mutates input array.

Comments

0

You can use for..of loop

for (var key of indexArr) resultArr[resultArr.length] = fruitier[key];

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.