2017-10-15 76 views
1

考慮到下面的對象數組,如果給定一個'thirdId'數組,讓前兩個id與傳入的對象相匹配,更好的方法是什麼方法?根據該對象中另外兩個屬性的值獲取Javascript對象屬性的值

const arrObjs = 
 
[ { firstId: '1', secondId: '1', thirdId: '5' }, 
 
    { firstId: '2', secondId: '1', thirdId: '12' }, 
 
    { firstId: '1', secondId: '2', thirdId: '13' }, 
 
    { firstId: '1', secondId: '1', thirdId: '42' }, 
 
    { firstId: '1', secondId: '2', thirdId: '51' } ]; 
 
    
 
const getThirdIds = (arrObjs, firstId, secondId) => { 
 
    const thirdIds = [] 
 

 
    arrObjs.map(obj => { 
 
     if (obj.firstId == firstId && obj.secondId == secondId) { 
 
     thirdIds.push(obj.thirdId) 
 
     } 
 
    }) 
 

 
    return thirdIds 
 
} 
 

 
console.log(getThirdIds(arrObjs, 1, 1));

我想從loDash保持距離。謝謝!

回答

2

我有一個過濾器,然後去映射,即

return arrObjs 
    .filter(obj => obj.firstId == firstId && obj.secondId == secondId) 
    .map(obj => obj.thirdId) 

Array.prototype.filter()將創建只有匹配項的新數組。

Array.prototype.map()然後將該數組轉換爲只包含每個條目的thirdId屬性的數組。


如果你並不熱衷於執行二套迭代(過濾器和地圖),你可以使用一個Array.prototype.reduce()操作

return arrObjs.reduce((/* collector */ thirdIds, /* each */ obj) => { 
    if (obj.firstId == firstId && obj.secondId == secondId) { 
    thirdIds.push(obj.thirdId) 
    } 
    return thirdIds 
}, /* initial collector value */ []) 
1

如果 「更好」 是指短:

const arrObjs = 
 
[ { firstId: '1', secondId: '1', thirdId: '5' }, 
 
    { firstId: '2', secondId: '1', thirdId: '12' }, 
 
    { firstId: '1', secondId: '2', thirdId: '13' }, 
 
    { firstId: '1', secondId: '1', thirdId: '42' }, 
 
    { firstId: '1', secondId: '2', thirdId: '51' } ] 
 
    
 
const getThirdIds = (a, b, c) => a.reduce((r, o) => 
 
      o.firstId == b && o.secondId == c ? r.concat(o.thirdId) : r, []) 
 

 
console.log(getThirdIds(arrObjs, 1, 1))


如果 「更好」 意味着更高效的,可以爲一個常數Ô被創建(1)搜索查找對象:

const arrObjs = [ { firstId: '1', secondId: '1', thirdId: '5' }, 
 
        { firstId: '2', secondId: '1', thirdId: '12' }, 
 
        { firstId: '1', secondId: '2', thirdId: '13' }, 
 
        { firstId: '1', secondId: '1', thirdId: '42' }, 
 
        { firstId: '1', secondId: '2', thirdId: '51' } ]; 
 

 
const lookup = [] 
 
for (let i = 0; i < arrObjs.length; i++) 
 
{ 
 
    const obj = arrObjs[i], 
 
    lookup1 = lookup [obj.firstId ] || (lookup [obj.firstId ] = []), 
 
    lookup2 = lookup1[obj.secondId] || (lookup1[obj.secondId] = []) 
 
    lookup2[lookup2.length] = +obj.thirdId 
 
} 
 

 
console.log(JSON.stringify(lookup))   // lookup = [,[,[5,42],[13,51]],[,[12]]] 
 

 
console.log(JSON.stringify(lookup[1][1])) // [5,42]