2017-06-26 48 views
0

使用lodash,當一個數組的id爲一個字符串時,如何通過比較id來合併兩個數組,另一個數組的id是一個字符串數?當每個數組中的id是不同類型(字符串,數字)時合併兩個數組

var a = [{ 
    id: 1, 
    item: 1 
}, { 
    id: 2, 
    item: 2 
}, { 
    id: 3, 
    item: 4 
}]; 

var b = [{ 
    id: "1", 
    profile: 1 
}, { 
    id: "2", 
    profile: 2 
}]; 

這就是我試過的。如果兩個數組中的ids都是字符串,或者兩個id都是數字,這可以正常工作。添加toString()或parseInt似乎也不工作。

return _.map(a, function(obj) { 
    return _.assign(obj, _.find(b, { 
     id: obj.id 
    })); 
}); 

回答

1

如何將自定義函數傳遞給_.find()方法?

return _.map(a, function(obj) { 
    return _.assign(obj, _.find(b, function(o) { 
     return o.id == obj.id; 
    })); 
}); 
+0

是否有一種方法,使對所得到的陣列中的所有是數字的ID?你說的方式,ids 1和2是字符串,id 3是一個數字。 – JAck28

+0

@ JAck28當然。只需將'_.assign()'的輸出分配給一個變量,並在將其返回到__map()'之前,將id值更改爲字符串或整型:https://jsfiddle.net/ugL7z0oy/。 –

+0

謝謝,那有效。 – JAck28

0
const merged = _.reduce(a, (acc, obj) => { 
    const match = _.find(b, val => obj.id == val.id); 
    return match ? _.concat(acc, _.assign(obj, match)) : acc; 
}, []); 

工作小提琴:https://jsfiddle.net/f6ss8vau/

0

您可以使用lodash的_.merge()。它遞歸合併數組和對象,並且執行鬆散平等(==)合併屬性:

var a = [{"id":1,"item":1},{"id":2,"item":2},{"id":3,"item":4}]; 
 

 
var b = [{"id":"1","profile":1},{"id":"2","profile":2}]; 
 

 
var result = _.merge([], a, b); 
 

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

+1

啊,看起來我過分複雜的東西。 – JAck28

相關問題