【问题标题】:How to get an array of values based on an array of indexes?如何根据索引数组获取值数组?
【发布时间】:2017-03-17 20:21:26
【问题描述】:

我有一组两个数组。一个包含一些作为字符串的水果值,另一个包含一些随机数。这里我认为数字数组是水果数组的索引。给定索引数组中的数字,如何得到一个新的水果数组?

示例代码:

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

输出:

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

【问题讨论】:

    标签: javascript arrays lodash


    【解决方案1】:

    使用.map:

    let resultArr = indexArr.map(i => fruitier[i])
    

    【讨论】:

      【解决方案2】:

      使用 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/lodash@4.17.11/lodash.min.js"></script>

      除了上述对 _.at() 的建议之外,需要注意的关键区别是 - 此方法会改变输入数组。

      【讨论】:

        【解决方案3】:

        如果你想用 lodash 实现,请使用 _.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>

        【讨论】:

        • 请注意,如果您使用流类型,它会报错,因为_.at() 期望第一个参数是对象,而不是数组。我认为可以使用// $FlowFixMe 忽略它
        【解决方案4】:

        Array#map 有效 (documentation)

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

        您也可以使用 Array#filter (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)); 
        };
        

        或者还有 Array#reduce (documentation)

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

        【讨论】:

          【解决方案5】:

          你可以使用for..of循环

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

          【讨论】:

            【解决方案6】:
            for(var i = 0; i < indexArr.length; i++)
              resultArr.push(fruitier[indexArr[i]]);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-11-29
              • 2013-01-02
              • 1970-01-01
              • 2022-06-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多