簡體   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