[英]Get the indexes of javascript array elements that satisfy condition
我有这样一个数组:
[{prop1:"abc",prop2:"qwe"},{prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"}]
我想获得满足条件的所有元素的索引; 在这种情况下,当prop1 == "abc"
。 所以期望的输出类似于[0,1]
。
苦苦寻找一种干净的方式来做到这一点? indexes = a.findIndex(x => x.prop1==="abc")
将为上面的数组返回0
,因为它在第一次成功查找时停止。
我觉得我想要这样的东西: indexes = a.filtered(x.index() => x.prop1==="abc")
您可以使用Array#reduce
方法。
var data = [{prop1:"abc",prop2:"qwe"},{prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"}]; console.log( data.reduce(function(arr, e, i) { if (e.prop1 == 'abc') arr.push(i); return arr; }, []) ) // with ES6 arrow syntax console.log( data.reduce((arr, e, i) => ((e.prop1 == 'abc') && arr.push(i), arr), []) )
简单的for
循环
var data = [{prop1:"abc",prop2:"qwe"},{prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"}]; var res = []; for (var i = 0; i < data.length; i++) { if (data[i].prop1 == 'abc') res.push(i); } console.log(res)
或者使用Array#filter
和Array#map
方法(不是一种有效的方法,因为它需要迭代两次)。
var data = [{prop1:"abc",prop2:"qwe"},{prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"}]; console.log( data.map(function(e, i) { return i; }).filter(function(e) { return data[e].prop1 == 'abc'; }) ) // With ES6 arrow syntax console.log( data.map((_, i) => i).filter(e => data[e].prop1 == 'abc') )
您可以使用reduce
功能。
var array = [{ prop1: "abc", prop2: "qwe" }, { prop1: "abc", prop2: "yutu" }, { prop1: "xyz", prop2: "qwrq" }]; var indexes = array.reduce((a, c, i/*Current index*/) => { if (c.prop1 == "abc") a.push(i); //Add the found index. return a; }, []/*Accumulator to store the found indexes.*/); console.log(indexes);
以下代码适用于我:
var data = [{prop1:"abc",prop2:"qwe"},{prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"}] var indexes = [] data.forEach((element, index)=>{ if(element.prop1 =="abc"){ indexes.push(index) } }); console.log(indexes)
您可以使用array.prototype.reduce
使用shorthand if
只使用一行代码:
var arr = [ {prop1:"abc",prop2:"qwe"}, {prop1:"abc",prop2:"yutu"},{prop1:"xyz",prop2:"qwrq"} ]; var indexes = arr.reduce((m, e, i) => (e.prop1 === 'abc' && m.push(i), m), []); console.log(indexes);
有一种纯粹的功能性方法,但它不是特别有效,因为它需要通过数组进行三次单独的线性扫描:
let indexes = array.map((e, i) => [i, e])
.filter(([i, e]) => predicate(e))
.map(([i, _]) => i);
哪里
let predicate = e => e.prop1 === 'abc';
这通过创建一个临时数组来实现,其中每个元素本身和包含原始索引和元素的数组。 然后它过滤掉谓词函数不为真的那些,然后剥离数组,使它们只包含索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.