2017-10-15 8 views
1

以下のオブジェクトの配列が与えられた場合、最初の2つのidsが渡されたものと一致する場合、 'thirdId'方法?そのオブジェクトの他の2つのプロパティの値に基づいて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))


"より良い" は検索対象が一定のOのために作成することができ、より効率的な意味(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]

関連する問題