如何基于第一个对象的键从第二个对象获取键值

时间:2020-02-12 10:05:08

标签: javascript arrays

在形成对象数组时我遇到一个小问题

    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字段。我使用循环来做到这一点。但是以这种方式会降低编译器的性能。有人可以帮助我以简单的方式实现吗?

4 个答案:

答案 0 :(得分:2)

在访问项目时,您可以使用mapMap集合来拥有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)

如果您想“最快”,那将取决于您在问题中尚未声明的许多内容。

也就是说,以下代码对我而言运行速度更快(与mapmergeforeach选项相比)在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);