2013-07-26 6 views
9

Ich habe 2 Listen von Objekten:tritt in Javascript

people = 
[{id: 1, name: "Tom", carid: 1}, 
{id: 2, name: "Bob", carid: 1}, 
{id: 3, name: "Sir Benjamin Rogan-Josh IV", carid: 2}]; 

cars= 
[{id: 1, name: "Ford Fiesta", color: "blue"}, 
{id: 2, name: "Ferrari", color: "red"}, 
{id: 3, name: "Rover 25", color: "Sunset Melting Yellow with hints of yellow"}]; 

Gibt es eine Funktion (möglicherweise in Angular, JQuery, Unterstrichen, LoDash oder andere externe Bibliothek) eine LEFT JOIN in einer Zeile auf diese zu tun ? Etwas wie:

peoplewithcars = leftjoin(people, cars, "carid", "id"); 

Ich kann mein eigenes schreiben, aber wenn LoDash eine optimierte Version hat, möchte ich das verwenden.

Antwort

3

Es ist nicht schwer mit Underscore.js

function leftJoin(left, right, left_id, right_id) { 
    var result = []; 
    _.each(left, function (litem) { 
     var f = _.filter(right, function (ritem) { 
      return ritem[right_id] == litem[left_id]; 
     }); 
     if (f.length == 0) { 
      f = [{}]; 
     } 
     _.each(f, function (i) { 
      var newObj = {}; 
      _.each(litem, function (v, k) { 
       newObj[k + "1"] = v; 
      }); 
      _.each(i, function (v, k) { 
       newObj[k + "2"] = v; 
      }); 
      result.push(newObj); 
     }); 
    }); 
    return result; 
} 

leftJoin(people, cars, "carid", "id"); 
1

Nein zu implementieren, LoDash nicht über beitreten es ist prety einfach, Ihre eigenen obwohl zu implementieren, ist dies nicht ganz anschließen, sondern wählt alle Menschen mit einem passenden Auto:

var peopleWithCars = _.filter(people, function (person) { 
     return _.exists(cars, function(car) { 
      return car.id === person.id; 
     }); 
    }); 
1

Sie Alasql JavaScript SQL-Bibliothek verwenden können zwei oder mehr Arrays von Objekten zu verbinden:

var res = alasql('SELECT people.name AS person_name, cars.name, cars.color \ 
    FROM ? people LEFT JOIN ? cars ON people.carid = cars.id',[people, cars]); 

Versuchen Sie dieses Beispiel at jsFiddle.

0

Hier ist eine einfache Schleife, die ich für ein Javascript (JQuery in diesem Fall) zu "join" obj1 und obj2 auf someID und fügen Sie eine Eigenschaft aus obj2 zu obj1.

Wenn Sie einen vollständigeren Join durchführen möchten, können Sie ihn durchlaufen und erweitern, um ihn auf obj2.hasOwnProperty() zu schleifen und das ebenfalls zu kopieren.

$.each(obj1,function(i){ 
     $.each(obj2, function(k){ 
      if (obj2[k].someID == obj1[i].someID){ 
       obj1[i].someValue = obj2[k].someValue; 
      } 
     }); 
    }); 
0

Dieses Beispiel verwendet Lodash das ersten angepaßte Objekt verbinden zu verlassen. Nicht ganz, was die Frage stellt, aber ich fand eine ähnliche Antwort hilfreich.

var leftTable = [{ 
 
    leftId: 4, 
 
    name: 'Will' 
 
}, { 
 
    leftId: 3, 
 
    name: 'Michael' 
 
}, { 
 
    leftId: 8, 
 
    name: 'Susan' 
 
}, { 
 
    leftId: 2, 
 
    name: 'Bob' 
 
}]; 
 

 
var rightTable = [{ 
 
    rightId: 1, 
 
    color: 'Blue' 
 
}, { 
 
    rightId: 8, 
 
    color: 'Red' 
 
}, { 
 
    rightId: 2, 
 
    color: 'Orange' 
 
}, { 
 
    rightId: 7, 
 
    color: 'Red' 
 
}]; 
 

 
console.clear(); 
 

 
function leftJoinSingle(leftTable, rightTable, leftId, rightId) { 
 
    var joinResults = []; 
 

 
    _.forEach(leftTable, function(left) { 
 
    \t  var findBy = {}; 
 
     findBy[rightId] = left[leftId]; 
 

 
     var right = _.find(rightTable, findBy), 
 
      result = _.merge(left, right); 
 

 
     joinResults.push(result); 
 
    }) 
 

 
    return joinResults; 
 
} 
 

 

 
var joinedArray = leftJoinSingle(leftTable, rightTable, 'leftId', 'rightId'); 
 
console.log(JSON.stringify(joinedArray, null, '\t'));

Ergebnisse

[ 
 
\t { 
 
\t \t "leftId": 4, 
 
\t \t "name": "Will" 
 
\t }, 
 
\t { 
 
\t \t "leftId": 3, 
 
\t \t "name": "Michael" 
 
\t }, 
 
\t { 
 
\t \t "leftId": 8, 
 
\t \t "name": "Susan", 
 
\t \t "rightId": 8, 
 
\t \t "color": "Red" 
 
\t }, 
 
\t { 
 
\t \t "leftId": 2, 
 
\t \t "name": "Bob", 
 
\t \t "rightId": 2, 
 
\t \t "color": "Orange" 
 
\t } 
 
]

0

Sie solche Sachen in der Ebene Javascript tun können.

people.map(man => 
     cars.some(car => car.id === man.carid) ? 
      cars.filter(car => car.id === man.carid).map(car => ({car, man})) : 
      {man} 
     ).reduce((a,b)=> a.concat(b),[]);