Javascript 筛选并获取多个索引

Javascript filter and get multiple indices

javascript 中有没有一种方法可以过滤并获取所有找到的项目的索引。 示例:

filter([{a: 5},{a,9},{a:1},{a:2}], el => el.a<3)  ===>>>  [2,3]

我觉得下划线应该有这个实用程序,但我似乎找不到它。

您可以组合映射和过滤器:

_.filter(_.map([{a: 5},{a: 9},{a:1},{a:2}], function(e, i) { return e.a < 3 ? i : null; }), function(e) {return e;})

无需使用 Underscore.js,只需简单地映射索引并在纯 JavaScript 中进行过滤即可。我在下面写了一个函数来处理 map-filter 逻辑。只需添加您自己的过滤器。

function findFilteredIndicies(arr, filterFn) {
  return arr.map(function(item, index) {
    return filterFn.apply(null, arguments) ? index : -1;
  }).filter(function(index) {
    return index > -1;
  });
}

var items = [{ a: 5 }, { a: 9 }, { a: 1 }, { a: 2 }];


var indicies = findFilteredIndicies(items, function(item) {
  return item.a < 3;
});


document.body.innerHTML = indicies;


另一种方式...

你也可以用Array.prototype.reduce,这样会更简洁,因为它本质上结合了map-filter。

调试表单

function findFilteredIndicies(arr, filterFn) {
  return arr.reduce(function(result, item, index) {
    if (filterFn.apply(null, [].slice.call(arguments, 1))) {
      result.push(index);
    }
    return result;
  }, []);
}

最小形式

function findFilteredIndicies(a, f) {
  return a.reduce(function(r, e, i) {
    return f.apply(null, [].slice.call(arguments, 1)) ? r.concat(i) : r;
  }, []);
}

缩小形式

findFilteredIndicies=function(a,f){return a.reduce(function(r,e,i){return f.apply(null,[].slice.call(arguments,1))?r.concat(i):r;},[]);}

小问题的小解决方案。

var data = [{ a: 5 }, { a: 9 }, { a: 1 }, { a: 2 }],
    indices = [];

data.forEach(function (a, i) {
    a.a < 3 && indices.push(i);
});
document.write('<pre>' + JSON.stringify(indices, 0, 4) + '</pre>');

这是一个使用 Typescript 和 ES6 的干净解决方案:

function findFilterIndices<T>(items: T[], predicate: (value: T) => boolean): number[] {
    return items
        .map((value, index) => predicate(value) ? index : null)
        .filter(index => index != null) as number[]
}

可以这样使用:

const arr = [11, 8, 17, 4]
console.log(findFilterIndices(arr, value => value > 10)) // prints [0, 2]