在形成对象数组时我遇到一个小问题
var json1 = [{
"PRODUCT_ID": "P02",
"QUANTITY": 2
}, {
"PRODUCT_ID": "P01",
"QUANTITY": 61
}]
var json2 = [{
"PRODUCT_ID": "P01",
"NAME": "PEN"
},{
"PRODUCT_ID": "P02",
"NAME": "Pencil"
}]
现在我需要像下面那样形成对象。
var finalJSON = [{
"PRODUCT_ID": "P01",
"NAME": "PEN",
"QUANTITY": 61
},{
"PRODUCT_ID": "P02",
"NAME": "Pencil",
"QUANTITY": 2
}]
在此示例中,我仅在数组中给出了2个对象。但是在实时情况下,我需要获取数千个对象来获取NAME
字段。我使用循环来做到这一点。但是以这种方式会降低编译器的性能。有人可以帮助我以简单的方式实现吗?
答案 0 :(得分:2)
在访问项目时,您可以使用map
和Map
集合来拥有O(1)
:
let unique = new Map(json2.map(s => [s.PRODUCT_ID, s.NAME]));
let result = json1.map(({PRODUCT_ID, QUANTITY})=>
({PRODUCT_ID, QUANTITY, Name: unique.get(PRODUCT_ID)}));
var json1 = [{
"PRODUCT_ID": "P02",
"QUANTITY": 2
}, {
"PRODUCT_ID": "P01",
"QUANTITY": 61
}]
var json2 = [{
"PRODUCT_ID": "P01",
"NAME": "PEN"
},{
"PRODUCT_ID": "P02",
"NAME": "Pencil"
}]
let unique = new Map(json2.map(s => [s.PRODUCT_ID, s.NAME]));
let result = json1.map(({PRODUCT_ID, QUANTITY})=>
({PRODUCT_ID, QUANTITY, Name: unique.get(PRODUCT_ID)}));
console.log(result);
答案 1 :(得分:1)
您可以将一个简单的对象作为哈希表,并通过检查哈希表来迭代数组。
function merge(target, hash = {}) {
return function (source) {
for (const item of source) {
if (!hash[item.PRODUCT_ID]) target.push(hash[item.PRODUCT_ID] = {});
Object.assign(hash[item.PRODUCT_ID], item);
}
};
}
var array1 = [{ PRODUCT_ID: "P02", QUANTITY: 2 }, { PRODUCT_ID: "P01", QUANTITY: 61 }],
array2 = [{ PRODUCT_ID: "P01", NAME: "PEN" }, { PRODUCT_ID: "P02", NAME: "Pencil" }],
result = [];
[array1, array2].forEach(merge(result));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
您可以执行以下操作,
var json1 = [{
"PRODUCT_ID": "P02",
"QUANTITY": 2
}, {
"PRODUCT_ID": "P01",
"QUANTITY": 61
}]
var json2 = [{
"PRODUCT_ID": "P01",
"NAME": "PEN"
},{
"PRODUCT_ID": "P02",
"NAME": "Pencil"
}]
const finalJson = json1.map(j1 => ({...j1, ...json2.filter(j2 => j2["PRODUCT_ID"] === j1["PRODUCT_ID"])[0]}))
console.log(finalJson)
答案 3 :(得分:0)
如果您想“最快”,那将取决于您在问题中尚未声明的许多内容。
也就是说,以下代码对我而言运行速度更快(与map
,merge
,foreach
选项相比)在Linux,Firefox和PC设置上的运行速度更快不同的JavaScript基准测试站点。
更大的测试样本(极有可能),真实数据或其他任何东西都可能改变结果。
var json1 = [{
"PRODUCT_ID": "P02",
"QUANTITY": 2
},{
"PRODUCT_ID": "P01",
"QUANTITY": 61
}];
var json2 = [{
"PRODUCT_ID": "P01",
"NAME": "PEN"
},{
"PRODUCT_ID": "P02",
"NAME": "Pencil"
}];
var finalJSON = [];
var i,j, max1 = json1.length, max2 = json2.length;
for(j=0;j<max2;j++) {
for(i=0;i<max1;i++) {
if (json1[i]["PRODUCT_ID"] == json2[j]["PRODUCT_ID"]) {
finalJSON[j] = {
"PRODUCT_ID":json1[i]["PRODUCT_ID"],
"NAME":json2[j]["NAME"],
"QUANTITY":json1[i]["QUANTITY"]
};
break;
}
}
}
console.log(finalJSON);