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]
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]