簡體   English   中英

Javascript-在對象數組中檢測反向對

[英]Javascript - Detect reverse pairs in an array of objects

我有一個對象數組:

[
{source: 'A', target : 'C', value: 25}, 
{source: 'E', target: 'F', value: 5}, 
{source: 'C', target: 'A', value: 20}, ...
]

如何檢測所有反向對,例如源:“ A”,目標:“ C”和源:“ C”,目標:“ A”,並求和:25 + 20?

首先使用兩個for循環生成所有可能的對,然后使用forEach遍歷每個pari以檢查源/目標屬性是否匹配,如果匹配,則計算總和:

 const arr = [ {source: 'A', target : 'C', value: 25}, {source: 'E', target: 'F', value: 5}, {source: 'C', target: 'A', value: 20} ]; const pairs = arr => { const out = []; for (let i = 0; i < arr.length - 1; ++i) { for (let j = i; j < arr.length - 1; ++j) { out.push([arr[i], arr[j + 1]]); } } return out; } pairs(arr).forEach(pair => { if (pair[0].source === pair[1].target && pair[0].target === pair[1].source) { console.log(pair[0].value + pair[1].value); } }); 

試試這個

 var abc = [ {source: 'A', target : 'C', value: 25}, {source: 'E', target: 'F', value: 5}, {source: 'C', target: 'A', value: 20}, {source: 'C', target: 'A', value: 200} //To test all pairs ] //Here you can use for loop to get pairs of each record var sourceA = abc[0].source; var targetA = abc[0].target; //check source against target and vice versa var result = abc.filter(x => x.target == sourceA && x.source == targetA); console.log("Result"); console.log(result); //if you want sum then var totalAmount = 0; result.forEach( data => totalAmount = totalAmount + data.value); console.log("Total amount"); console.log(totalAmount); 

您可以對散列表使用一對排序的聯合鍵。

 var array = [{ source: 'A', target : 'C', value: 25 }, { source: 'E', target: 'F', value: 5}, { source: 'C', target: 'A', value: 20 }], hash = {}, pairs = array.reduce((r, { source, target, value }) => { var key = [source, target].sort().join('|'); if (!hash[key]) { r.push(hash[key] = { source, target, value }); return r; } hash[key].value += value; return r; }, []); console.log(pairs); 

尋找所有對時,可以使用:

var arr = [
  {source: 'A', target : 'C', value: 25}, 
  {source: 'E', target: 'F', value: 5}, 
  {source: 'C', target: 'A', value: 20},
  {source: 'D', target: 'A', value: 2},
  {source: 'A', target: 'D', value: 1}
]    

var res = arr.reduce((acc, {source,target,value}, id, input) => {
    var findPair = el => el.source == target && el.target == source;
    var pair = !acc.some(findPair) && input.find(findPair);
    return pair ? [...acc, {source, target, sum: pair.value + value}]: acc;
}, []);

返回:

[ { source: 'A', target: 'C', sum: 45 },
  { source: 'D', target: 'A', sum: 3 } ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM