繁体   English   中英

获取满足条件的javascript数组元素的索引

[英]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#filterArray#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM