【问题标题】:EcmaScript6 findIndex method, can it return multiple values?EcmaScript6 findIndex 方法,它可以返回多个值吗?
【发布时间】:2018-07-03 15:37:01
【问题描述】:

在学习 ES6 时,我试图在 Array 上查找多个项目的索引,但我只得到了与我的条件或回调函数匹配的第一个项目的索引。

示例: 我有一个年龄数组,我想要所有年龄大于或等于 18 的索引。

let ages = [12,15, 18, 17, 21];
console.log(`Over 18: ${ages.findIndex(item => item >= 18)}`);
// output that i'm looking: [2,4]
// output that is coming: 2

所以我想了解Array.prototype.findIndex() 方法是否只返回匹配的第一个项目的单个索引,或者-1 是任何满足条件的项目。我们如何使用 ES6 来做到这一点?


谢谢

【问题讨论】:

    标签: javascript arrays ecmascript-6


    【解决方案1】:

    您可以在这里使用.map() 方法,例如:

    let ages = [12, 15, 18, 17, 21];
    let indexes = ages.map((elm, idx) => elm >= 18 ? idx : '').filter(String);
    console.log( indexes );

    .map() 方法的语法如下:

    var new_array = arr.map(function callback(currentValue[, index[, array]]) {
        // Return element for new_array
    }[, thisArg])
    

    我们可以使用currentValueindex 来满足我们的要求。

    它的通用函数可以是:

    const ages = [12, 15, 18, 17, 21];
    const getAllIndexes = (arr, val) => {
      return arr.map((elm, idx) => elm >= val ? idx : '').filter(String);
    }
    
    console.log(getAllIndexes(ages, 18));
    console.log(getAllIndexes(ages, 17));

    【讨论】:

    • 点赞!喜欢这个 :)。简单整洁。因为这个解决方案更容易翻译成英语,而且在我的脑海中,我一直认为reduce 用于需要累加器并将数组简化为某种形式的复杂场景
    • 由于Array.map 返回一个与原始数组长度相同的数组,我会说Array.reduce 是一个更好的选择。
    【解决方案2】:

    findIndex() 方法返回 first 元素在 满足提供的测试功能的数组。否则 -1 是 返回。

    一个选项是改用reduce。如果数字大于等于18,使用concat将索引添加到累加器

    let ages = [12, 15, 18, 17, 21];
    
    let result = ages.reduce((c, v, i) => v >= 18 ? c.concat(i) : c, []);
    
    console.log(result);

    【讨论】:

    • 非常优雅的解决方案,谢谢!
    【解决方案3】:

    只需使用Array.reduce() 并使所有年龄大于18 的索引数组。

    let ages = [12,15, 18, 17, 21];
    var result = ages.reduce((a,curr,index)=>{
      if(curr >= 18)
        a.push(index);
      return a;
    },[]);
    console.log(result);

    【讨论】:

    • 我不是在这里质疑答案的正确性,请原谅我,我只是出于好奇而问 - 为什么reduce?这可以简单地通过一个简单的map 或任何暴露迭代索引/ices 的array.prototype.fn 来实现。我问是因为 reduce 可以用于更复杂的场景
    • @Jaya 地图将为不满足条件的年龄返回未定义的值(在您的情况下为索引)。因此,您必须使用过滤器再次过滤掉未定义的值,这会影响性能。
    • 对,地图+过滤器就是我的意思。当然,仅 Map 不足以实现最终结果。有趣的是你提到 perf - 因为我认为 reduce 这里有一个 if 形式的过滤器所以想知道为什么不先映射然后过滤
    • @Jaya 但在减少的情况下,您只需要迭代整个数组一次而不是两次。在 map + filter 的情况下,您必须遍历整个数组两次(一次用于 map,然后用于 filter)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多