如何在 Javascript 中合并和过滤两个对象数组
How to merge and filter two arrays of objects in Javascript?
>我有以下内容:
var owners = [{
"ownerid": "11",
"name": "jane",
"sex": "female"
}, {
"ownerid": "22",
"name": "mike",
"sex": "male"
}, {
"ownerid": "33",
"name": "alex",
"sex": "male"
}];
var cars = [{
"ownerid": "11",
"make": "ford",
"model": "mustang"
}, {
"ownerid": "11",
"make": "honda",
"model": "civic"
}, {
"ownerid": "33",
"make": "toyota",
"model": "corolla"
}];
我想以这个结束
var mergedandfiltered = [{
"name": "jane",
"sex": "female",
"make": "ford",
"model": "mustang"
}, {
"name": "jane",
"sex": "female",
"make": "honda",
"model": "civic"
}, {
"name": "alex",
"sex": "male",
"make": "toyota",
"model": "corolla"
}];
这个想法是合并和过滤结果,所以我有一个所有者,所有者财产以及他们拥有的汽车和汽车属性的列表。迈克没有任何汽车,所以没有出现在结果中。"所有者 ID"是通用链接,但我不需要它在结果中显示。
请首选纯JS解决方案!
首先构建一个对象用于引用所有者,然后迭代汽车,并组合一个新对象。
var owners = [{ "ownerid": "11", "name": "jane", "sex": "female" }, { "ownerid": "22", "name": "mike", "sex": "male" }, { "ownerid": "33", "name": "alex", "sex": "male" }],
cars = [{ "ownerid": "11", "make": "ford", "model": "mustang" }, { "ownerid": "11", "make": "honda", "model": "civic" }, { "ownerid": "33", "make": "toyota", "model": "corolla" }],
obj = {},
result;
owners.forEach(function (a) {
obj[a.ownerid] = a;
});
result = cars.map(function (a) {
return {
name: obj[a.ownerid].name,
sex: obj[a.ownerid].sex,
make: a.make,
model: a.model
};
});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
var owners = [{"ownerid":"11", "name":"jane", "sex":"female"}, {"ownerid":"22", "name":"mike", "sex":"male"}, {"ownerid":"33", "name":"alex", "sex":"male"}];
var cars = [{"ownerid":"11", "make":"ford", "model":"mustang"}, {"ownerid":"11", "make":"honda", "model":"civic"}, {"ownerid":"33", "make":"toyota", "model":"corolla"} ];
var mergedandfiltered = [];
for(var i = 0; i < owners.length; i++){
for(var j = 0; j < cars.length; j++){
if(owners[i]['ownerid'] == cars[j]['ownerid']){
mergedandfiltered.push({"name":owners[i]['name'],"sex":owners[i]['sex'],"make":cars[j]['make'],"model":cars[j]['model']});
}
}
}
为了提高效率,我们首先将用户列表转换为使用 owner 作为键的字典。我们可以使用 Array.protoype.reduce 来做到这一点:
var ownerDict = owners.reduce(function(p, c) {
p[c.ownerid] = c;
return p;
}, {});
这将为您提供一个如下所示的对象:
{
"11": {
"ownerid": "11",
"name": "jane",
"sex": "female"
},
"22": {
"ownerid": "22",
"name": "mike",
"sex": "male"
},
"33": {
"ownerid": "33",
"name": "alex",
"sex": "male"
}
}
我们这样做的原因是,现在我们可以通过以下方式查找用户:
var owner = ownerDict[11];
这将返回对象:
{
"ownerid": "11",
"name": "jane",
"sex": "female"
}
而那个抬头是O(1)
.如果你必须实际搜索数组才能找到它,假设它还没有排序,你的搜索将是O(n)
(如果它被排序,你的示例数据实际上看起来是,它只是稍微好一点 - 你可以使用二叉树搜索,这是O(log(n))
,但这仍然比O(1)
慢,代码更复杂。
现在有了这个字典,我们现在可以使用 Array.prototype.map 将我们的cars
数组转换为您想要的内容,如下所示:
var mergedandfiltered = cars.map(function(c) {
var owner = ownerDict[c.ownerid];
return {
name: owner.name,
sex: owner.sex,
make: c.make,
model: c.model
};
});
var mergedandfiltered = [];
for (var i = 0; i < owners.length; i++) {
var oID = owners[i].ownerid;
for (var j = 0; j < cars.length; j++) {
var mitem = {};
cID = cars[j].ownerid;
if (oID==cID) {
mitem.name = owners[i].name;
mitem.sex = owners[i].sex;
mitem.make = cars[j].make;
mitem.model = cars[j].model;
mergedandfiltered.push(mitem);
}
}
}
var owners = [ {
"ownerid" : "11",
"name" : "jane",
"sex" : "female"
}, {
"ownerid" : "22",
"name" : "mike",
"sex" : "male"
}, {
"ownerid" : "33",
"name" : "alex",
"sex" : "male"
} ];
var cars = [ {
"ownerid" : "11",
"make" : "ford",
"model" : "mustang"
}, {
"ownerid" : "11",
"make" : "honda",
"model" : "civic"
}, {
"ownerid" : "33",
"make" : "toyota",
"model" : "corolla"
} ];
var merge = function(array, array2, filter) {
var result = [];
for ( var i in array) {
for (var j in array2) {
var filtered = filter(array[i],array2[j]);
if (filtered != null){
result.push(filtered);
}
}
}
return result;
};
var result = merge(owners,cars,function(owner,car){
if (owner.ownerid == car.ownerid){
return {
name : owner.name,
model : car.model
};
}
return null;
});
console.log('array',result);
您可以将所有者数组转换为"哈希"(使用所有者作为键),然后根据 ownerid 从汽车数组中获取其属性。
var hashowners = [];
owners.forEach(function(o) {
hashowners[o.ownerid] = {"name": o.name, "sex": o.sex};
});
var finalcars = cars.map( function(car) {
car.name = hashowners[car.ownerid].name;
car.sex = hashowners[car.ownerid].sex;
delete car.ownerid;
return car;
});
console.log(finalcars)
小提琴:https://jsfiddle.net/61fb13n8/
相关文章:
- 如何使用 node.js 比较两个 json 数组
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 访问$.ajax()函数中的两个不同数组
- 正在更新mongod中两个对象内部的数组
- 如何使用javascript合并两个对象数组
- 比较包含多个值对的两个JavaScript数组
- jQuery对象从html表中查询为两个一维数组,用于Chartist图表
- 检查来自不同数组的两个元素的一个属性是否相等
- 如何在javascript中合并两个对象数组
- JavaScript - 合并两个对象数组并根据属性值删除重复数据
- 效率:整数数组的一个子集中两个项之间的最大差值
- 将两个值组合成extjs 4.1的形式
- 如何将中的两个geoJSON功能集合添加到两个层组中
- 在 JQuery 验证中验证多个“数组命名”文件输入和下拉列表
- 在一个区间之间生成两个随机数组
- 使用两个捕获组和JavaScript的replace()函数
- 通过找到两个重复组之一的正则表达式组
- 从Javascript中的两个子数组中获取随机结果
- 如何在一个可选的非捕获组中创建两个捕获组
- paper.js:获取两个层/组的原始像素数据