Korzystanie z Lodash, jak mogę połączyć dwie tablice, porównując identyfikatory, gdy jedna tablica ma identyfikator jako łańcuch, a drugi ma identyfikator jako numer?

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

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

To właśnie próbowałem. Działa dobrze, jeśli identyfikatory w obu maiwach są ciągi, albo obie ID są liczbami. Dodanie Tostring () lub Parseint też nie działa.

return  _.map(a, function(obj) {
    return _.assign(obj, _.find(b, {
        id: obj.id
    }));
});
0
JAck28 26 czerwiec 2017, 22:34

3 odpowiedzi

Najlepsza odpowiedź

Co powiesz na przekazanie funkcji niestandardowej do _.find() Metoda?

return  _.map(a, function(obj) {
    return _.assign(obj, _.find(b, function(o) {
        return o.id == obj.id;
    }));
});
1
Joseph Marikle 26 czerwiec 2017, 19:38

Możesz użyć Lodasha _.merge(). Rekurencyjnie łączy tablice i obiekty i wykonuje luźną równość (==), aby scalić właściwości:

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>
0
Ori Drori 26 czerwiec 2017, 19:59
const merged = _.reduce(a, (acc, obj) => {
    const match = _.find(b, val => obj.id == val.id);
    return match ? _.concat(acc, _.assign(obj, match)) : acc;
}, []);

Porozmawiający skrzypce: https://jsfiddle.net/f6ss8vau/

0
adrice727 26 czerwiec 2017, 19:53