加入Javascript

加入Javascript,javascript,join,underscore.js,lodash,Javascript,Join,Underscore.js,Lodash,我有两个对象列表: 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

我有两个对象列表:

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"}];
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]);
是否有一个函数(可能在Angular、JQuery、下划线、LoDash或其他外部库中)在这些函数的一行中执行左连接?比如:

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

我可以自己写,但是如果LoDash有一个优化的版本,我愿意使用它。

Linq.js将做连接以及其他许多事情。

使用下划线.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");

不,LoDash没有加入不过,实现您自己的加入很容易,这不是一个很好的加入,而是选择所有拥有匹配汽车的人:

    var peopleWithCars = _.filter(people, function (person) {
        return _.exists(cars, function(car) {
            return car.id === person.id;
        });
    });
您可以使用JavaScript SQL库连接两个或多个对象数组:

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"}];
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]);

试试这个例子。

下面是我为Javascript(本例中为JQuery)所做的一个简单循环,用于“连接”someID上的obj1和obj2,并将一个属性从obj2添加到obj1

如果您想进行更完整的联接,可以遍历并展开它,在obj2.hasOwnProperty()上循环并复制它

    $.each(obj1,function(i){
        $.each(obj2, function(k){
            if (obj2[k].someID == obj1[i].someID ){
                obj1[i].someValue = obj2[k].someValue;
            }
        });
     });
此示例使用Lodash左连接第一个匹配的对象。不完全是问题的答案,但我发现类似的答案很有帮助

var leftTable=[{
左ID:4,
姓名:“威尔”
}, {
左ID:3,
姓名:“迈克尔”
}, {
左ID:8,
名字:“苏珊”
}, {
左ID:2,
姓名:“鲍勃”
}];
var rightTable=[{
右ID:1,
颜色:“蓝色”
}, {
右ID:8,
颜色:“红色”
}, {
右ID:2,
颜色:“橙色”
}, {
右ID:7,
颜色:“红色”
}];
console.clear();
函数leftJoinSingle(leftTable、rightTable、leftId、rightId){
var joinResults=[];
_.forEach(左表,函数(左){
var findBy={};
findBy[rightId]=left[leftId];
var right=uu.find(rightTable,findBy),
结果=\合并(左、右);
joinResults.push(结果);
})
返回结果;
}
var joinedaray=leftJoinSingle(leftTable,rightable,'leftId','righid');

log(JSON.stringify(joinedArray,null,“\t”)您可以在纯javascript中执行此类操作

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),[]);

此实现使用ES6扩展运算符。同样,不是要求的库函数

const leftJoin = (objArr1, objArr2, key1, key2) => objArr1.map(
    anObj1 => ({
        ...objArr2.find(
            anObj2 => anObj1[key1] === anObj2[key2]
        ),
        ...anObj1
    })
);