Javascript 如果某些键:值匹配,将属性从一个对象附加到另一个对象的最有效方法是什么?

Javascript 如果某些键:值匹配,将属性从一个对象附加到另一个对象的最有效方法是什么?,javascript,arrays,object,Javascript,Arrays,Object,假设我有两个相当大的数据源,每个都有3000多个条目。他们可能看起来像这样 const arOfObj1 = [ { type: 'Something', properties: { name: 'ABC' } }, { type: 'Something', properties: { name: 'DEF' } }, { type: 'Something', properties: { name: 'GHI' } }, ...and so on... ]; const arO

假设我有两个相当大的数据源,每个都有3000多个条目。他们可能看起来像这样

const arOfObj1 = [
  { type: 'Something', properties: { name: 'ABC' } },
  { type: 'Something', properties: { name: 'DEF' } },
  { type: 'Something', properties: { name: 'GHI' } },
  ...and so on...
];

const arOfObj2 = [
  { name: 'ABC', stats: { age: 1, other: "Something" } },
  { name: 'DEF', stats: { age: 2, isEnrolled: true } },
  { name: 'GHI', stats: { age: 3 } },
  ...and so on...
];
arOfObj1.forEach(obj1 => {
  arOfObj2.forEach(obj2 => {
    if (obj1.properties.name === obj2.name) {
    obj1.stats = obj2.stats
    }
  })
});
查找每个对象中匹配的
name
属性,并将
stats{…}
(或其他属性,如果存在)从
arOfObj2
添加到
arOfObj1
,最有效的方法是什么?所以我最终会得到这样的结果

const newArOfObj1 = [
  { type: 'Something', properties: { name: 'ABC', stats: { age: 1, other: "Something" } },
  { type: 'Something', properties: { name: 'DEF', stats: { age: 2, isEnrolled: true } },
  { type: 'Something', properties: { name: 'GHI', stats: { age: 3 } },
  ...and so on...
]
我最初的想法是这样做

const arOfObj1 = [
  { type: 'Something', properties: { name: 'ABC' } },
  { type: 'Something', properties: { name: 'DEF' } },
  { type: 'Something', properties: { name: 'GHI' } },
  ...and so on...
];

const arOfObj2 = [
  { name: 'ABC', stats: { age: 1, other: "Something" } },
  { name: 'DEF', stats: { age: 2, isEnrolled: true } },
  { name: 'GHI', stats: { age: 3 } },
  ...and so on...
];
arOfObj1.forEach(obj1 => {
  arOfObj2.forEach(obj2 => {
    if (obj1.properties.name === obj2.name) {
    obj1.stats = obj2.stats
    }
  })
});

只是不确定是否有比对
arOfObj1

中的每个条目循环使用
arOfObj2
更好的方法,我不知道最有效的方法是什么,也不知道javascript中的内存是如何工作的,但我有一种方法可以工作

const arOfObj1=[
{type:'Something',properties:{name:'ABC'}},
{type:'Something',properties:{name:'DEF'}},
{type:'Something',properties:{name:'GHI'}}
];
常数arOfObj2=[
{name:'ABC',stats:{age:1,other:'Something'},
{name:'DEF',stats:{age:2,isEnrolled:true},
{name:'GHI',stats:{age:3}}
];
var name=newmap();
对于(变量i=0,len=arOfObj2.length;iconsole.log(arOfObj1)我不知道最有效的方法是什么,我也不知道javascript中的内存是如何工作的,但我有一种方法可以工作

const arOfObj1=[
{type:'Something',properties:{name:'ABC'}},
{type:'Something',properties:{name:'DEF'}},
{type:'Something',properties:{name:'GHI'}}
];
常数arOfObj2=[
{name:'ABC',stats:{age:1,other:'Something'},
{name:'DEF',stats:{age:2,isEnrolled:true},
{name:'GHI',stats:{age:3}}
];
var name=newmap();
对于(变量i=0,len=arOfObj2.length;iconsole.log(arOfObj1)在JavaScript应用程序中,内存通常不是问题,3000多个对象数组对于现代机器来说并不是那么大。我得假设你在寻求提速

如果我错了,而您正在寻找更高效的内存,那么请忽略我的响应,并使用类似于避免一次性加载内存,而是将内存负载分散到各个批中的方法进行批处理


假设我们正在寻找一种最快的方式来完成任务

代码:
  • 地图/查找
  • 简单双for循环

  • 在JavaScript应用程序中,内存通常不是问题,3000多个对象数组对于现代机器来说并不是那么大。我得假设你在寻求提速

    如果我错了,而您正在寻找更高效的内存,那么请忽略我的响应,并使用类似于避免一次性加载内存,而是将内存负载分散到各个批中的方法进行批处理


    假设我们正在寻找一种最快的方式来完成任务

    代码:
  • 地图/查找
  • 简单双for循环

  • 请将您尝试过的代码添加到问题中。@jmargolisvt-done请将您尝试过的代码添加到问题中。@jmargolisvt-done
    let arOfObj1 = [];
    let arOfObj2 = [];
    
    for (let i = 0; i < 5000; i++) {
      arOfObj1.push({type: 'Something', properties: { name: `name${i}` }});
      arOfObj2.push({name: `name${i}`, stats: { age: i, other: "Something" }});
    }
    
    console.time('map/find');
    arOfObj1.map(o => ({
      ...o,
      properties: {
        ...o.properties,
        stats: arOfObj2.find(a => a.name === o.properties.name).stats
      }
    }));
    console.timeEnd('map/find');
    
    console.time('for loop');
    let result = [];
    for (let i = 0; i < arOfObj1.length; i++) {
      let o = arOfObj1[i];
      let stats;
      for (let j = 0; j < arOfObj2.length; j++) {
        if (stats) break;
        let a = arOfObj2[j];
        if (a.name === o.properties.name) {
          stats = a.stats;
        }
      }
      result.push({
        ...o, properties: {...o.properties, stats}
      });
    }
    console.timeEnd('for loop');
    
    console.time('programmerRaj\'s solution');
    var names = new Map();
    for(var i = 0, len = arOfObj2.length; i < len; i++){
      var obj = arOfObj2[i];
      names.set(obj.name, obj.stats);
    }
    for(var i = 0, len = arOfObj1.length; i < len; i++){
      var properties = arOfObj1[i].properties;
      properties.stats = names.get(properties.name);
    }
    console.timeEnd('programmerRaj\'s solution');
    
    map/find: 189.902ms
    for loop: 188.912ms
    programmerRaj's solution: 3.236ms