2017-10-10 91 views
1

有沒有辦法使用ES5/ES6優化以下內容?使用.map/.filter/.reduce或其他東西的優化雙倍

var obj = []; 
var set; 
for (var key_s in data1) { 
    set = false; 
    for (var key_s2 in data2) { 
     if (data1[key_s].id === data2[key_s2].id) { 
      obj.push({'id': data1[key_s].id, 
         'key': data1[key_s].key, 
         'value': data2[key_s2].value}) 
      set = true; 
      break; 
     } 
    } 
    if (!set) 
     obj.push({'id': data1[key_s].id, 
        'key': data1[key_s].key, 
        'value': "EMPTY"}) 
} 

我想有一個包含的data1所有鍵的對象,如果一對data2得到了相同的id像一個,它應該利用其value,否則它應該成爲'EMPTY'。或者,有沒有辦法使用Object.assign與一些特殊的參數或東西?

+1

優化是什麼意思?效率?可讀性? – Carcigenicate

+1

請加上'data1'和'data2'以及想要的結果。 –

+0

'data1'和'data2'是否都是數組? – 4castle

回答

1

你可以使用Mapdata2和使用Array#mapdata1data2的可能值。

var map = new Map(data2.map(o => ([o.id, o]))), 
    obj = data1.map(({ id, key }) => ({ id, key, value: map.has(id) 
     ? map.get(id).value 
     : 'EMPTY' 
    })); 
0

您可以用Array#mapArray#findObject.assign做到這一點。通過在Object.assign的第一個參數中指定value,可以設置默認值,以便從data2中的對象覆蓋。

var obj = data1.map(obj1 => { 
    const obj2 = data2.find(obj2 => obj1.id === obj2.id); 
    return Object.assign({ value: 'EMPTY' }, obj1, obj2); 
}); 

使用spread properties,該Object.assign可改爲:

{ value: 'EMPTY', ...obj1, ...obj2 } 
+0

你可以從'data2'的對象中添加一些其他(不需要的)屬性.. –

+0

@NinaScholz的確如此。我只是假設不會有其他屬性,或者它不重要。我更喜歡你的解決方案,因爲它不會每次迭代'data2'。 – 4castle

0

這是相當es6'ed。 map over data1,則.find將返回匹配對象(如果存在),否則返回undefined。將key_s.value設置爲key_s2值或"EMPTY",然後返回key_s對象。你最終會得到一組對象。這假設data1和data2是對象數組,這就是你的例子寫的,所以我認爲是這樣。

let obj = data1.map(key_s => { 
    let newValue = data2.find(key_s2 => key_s.id === key_s2.id) 
    key_s.value = newValue ? newValue.value : "EMPTY" 
    return key_s 
}) 
})