2016-11-15 72 views
3

我使用Backbone/lodash作爲項目,我希望根據特定值合併2個對象數組。在下面的例子中,合併是基於具有2個不同鍵(id和數字)的相同值。通過加入值用lodash合併2個不同鍵的對象數組

var people = [ 
    { 
     id: "1", 
     name: "John" 
    }, 
    { 
     id: "2", 
     name: "Jane" 
    } 
]; 

var data = [ 
    { 
     number: "2", 
     role: "Designer" 
    }, 
    { 
     number: "1", 
     role: "Developer" 
    } 
]; 

// Outpout 

var merge = [ 
    { 
     id: "1", 
     number: "1", 
     name: "John", 
     role: "Developer" 
    }, 
    { 
     id: "2", 
     number: "2", 
     name: "Jane", 
     role: "Designer" 
    } 
]; 

回答

1
_.map(people, function(p){ 
    return _.merge(
     p, 
     _.find(data, {number: p.id}) 
    ) 
}) 
1
  • 排序陣列。

  • zipWith將陣列拉到一起。

  • defaults合併每個對象迭代。

var people = [ 
 
    {id: "1", name: "John"}, 
 
    {id: "2", name: "Jane"} 
 
]; 
 

 
var data = [ 
 
    {number: "2", role: "Designer"}, 
 
    {number: "1", role: "Developer"} 
 
]; 
 

 
var result = _.zipWith(
 
    _.sortBy(people, person => person.id), 
 
    _.sortBy(data, dataItem => dataItem.number), 
 
    (person, dataItem) => _.defaults(person, dataItem) 
 
); 
 

 
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.1/lodash.min.js"></script>

0

可以JavaScript來所有dataArray#map()在迭代,並做了Array#find()設置所有p對象屬性,其中p.id === d.number

var people = [{id: "1",name: "John"}, {id: "2",name: "Jane"}], 
 
    data = [{number: "2",role: "Designer"}, {number: "1",role: "Developer"}], 
 
    merge = data.map(d => { 
 
     var p = people.find(p => p.id === d.number); 
 
     p.number = d.number; 
 
     p.role = d.role; 
 

 
     return p; 
 
    }); 
 

 
// Outpout 
 
console.log(merge);
.as-console-wrapper { max-height: 100% !important; top: 0; }

2

我不知道lodash函數完全滿足此用例。然而,你的目標可以用純JavaScript和lodash助手_.assign()_.values()可以實現相當不錯:

var people = [{id: "1", name: "John"}, {id: "2", name: "Jane"}]; 
 
var data = [{number: "2", role: "Designer"}, {number: "1", role: "Developer"}]; 
 

 
var resultObj = {}; 
 

 
people.forEach(function(item) { 
 
    resultObj[item.id] = item; 
 
}); 
 
data.forEach(function(item) { 
 
    resultObj[item.number] = _.assign({}, resultObj[item.number], item); 
 
}); 
 

 
var result = _.values(resultObj); 
 
console.log(result);
<script src='https://cdn.jsdelivr.net/lodash/4.17.1/lodash.min.js'></script>

+1

@YosvelQuintero它是如何更好地在每個'data'迭代項目,每個項目在'people'上迭代一次以找到匹配的項目?除了這會將算法的複雜性從線性增加到二次方法之外,您的解決方案還會使「人」中的對象發生變化。我看到的唯一優點是您的解決方案隱藏了'Array.prototype.find()'背後的一些複雜性。 – Timo

+0

我的解決方案只對所有'data'進行一次迭代,並執行'Array.find()'。查找將返回與提供的函數匹配的第一個元素。比設置對象屬性並對「合併數組」進行推送。這些都需要 –

+0

嗯,是的。但是,如果不通過迭代數組,你認爲'find()'是否工作? – Timo