加入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
})
);