javascript - 如何使用相同的键聚合 2 个 json 数组的所有列

标签 javascript json

我想从

var var1 = [
  {key:'key1',value1:'value11'},
  {key:'key2',value1:'value12'}
];

var var2 = [
  {key:'key1',value2:'value21'},
  {key:'key2',value2:'value22'}
];

到这里

var var3 = [
  {key:'key1',value1:'value11',value2:'value21'},
  {key:'key2',value1:'value12',value2:'value22'}
];

最简单的方法是什么?

最佳答案

较慢的解决方案

一种解决方案是仅迭代 array1,并且对于每个对象,如果 array2 中已存在带有其键的对象,则将其合并。

此解决方案将具有恒定的空间,但时间为二次O(arr1.length) * O(arr2.length),因为对于 array1 中的每个对象,我们都在 array2 中搜索匹配项。

var var1=[{key:"key1",value1:"value11"},{key:"key2",value1:"value12"}],var2=[{key:"key1",value2:"value21"},{key:"key2",value2:"value22"}];

// O(N*M) time, O(1) space
function mergeQuadratic(arr1, arr2) {
  const result = [];

  arr1.forEach(obj1 => {
    // try to find a match for the current arr1 object by searching through arr2
    const obj2 = arr2.find(obj2 => obj2.key === obj1.key);

    // if we found a match, we can merge these two objects
    if (obj2) {
      result.push(Object.assign({}, obj1, obj2));
    }
  });

  return result;
}

console.log(mergeQuadratic(var1, var2));

ES5 版本:

var var1=[{key:"key1",value1:"value11"},{key:"key2",value1:"value12"}],var2=[{key:"key1",value2:"value21"},{key:"key2",value2:"value22"}];

// O(N*M) time, O(1) space
function mergeQuadratic(arr1, arr2) {
  var result = [];
  arr1.forEach(function(obj1) {
    // try to find a match for the current arr1 object by searching through arr2
    var obj2 = arr2.find(function(obj2) {
      return obj2.key === obj1.key
    });

    // if we found a match, we can merge these two objects
    if (obj2) {
      result.push(Object.assign({}, obj1, obj2));
    }
  });

  return result;
}

console.log(mergeQuadratic(var1, var2));

更快的解决方案

提高速度的一项改进是权衡一些空间并从 array2 创建映射,这样我们就可以将匹配键的查找时间减少到恒定,从而为我们提供线性运行时间 O(array1.length) + O(array2.length) 和线性空间 O(array2.length):

var var1=[{key:"key1",value1:"value11"},{key:"key2",value1:"value12"}],var2=[{key:"key1",value2:"value21"},{key:"key2",value2:"value22"}];

// O(N+M) time, O(N) space
function mergeLinear(arr1, arr2) {
  // create a map of key->obj for every object in arr2
  const map = arr2.reduce((map, curr) => {
    map.set(curr.key, curr);
    return map;
  }, new Map());

  const result = [];

  arr1.forEach(obj1 => {
    // check almost instantly if a matching object exists
    const obj2 = map.get(obj1.key); // <-- Constant time lookup

    // if we found a match, we can merge these two objects
    if (obj2) {
      result.push(Object.assign({}, obj1, obj2));
    }
  });

  return result;
}

console.log(mergeLinear(var1, var2));

ES5 版本:

var var1=[{key:"key1",value1:"value11"},{key:"key2",value1:"value12"}],var2=[{key:"key1",value2:"value21"},{key:"key2",value2:"value22"}];

// O(N+M) time, O(N) space
function mergeLinear(arr1, arr2) {
  // create a map of key->obj for every object in arr2
  var map = arr2.reduce(function(map, curr) {
    map[curr.key] = curr;
    return map;
  }, Object.create(null));

  var result = [];

  arr1.forEach(function(obj1) {
    // check almost instantly if a matching object exists
    var obj2 = map[obj1.key]; // <-- Constant time lookup

    // if we found a match, we can merge these two objects
    if (obj2) {
      result.push(Object.assign({}, obj1, obj2));
    }
  });

  return result;
}

console.log(mergeLinear(var1, var2));

关于javascript - 如何使用相同的键聚合 2 个 json 数组的所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41626816/

相关文章:

javascript - 仅当圆圈具有关联注释时才在折线图中附加圆圈

javascript - 如何在网页上隔离包含第 3 方 HTML 片段?

javascript - 如何更改 Alpine.js 中的共享状态?

sql - 在 Redshift 中使用 json_extract_path_text 时如何跳过错误?

javascript - 如何使用 javascript 或 jquery 将日期转换为 JSON 格式?

javascript - 在 Vue 3 中加载异步选项时自动选择第一个 <select> 选项

javascript - 帮助 JavaScript 作用域

c# - 如何将动态对象转换为 JSON 字符串 c#?

ios - 在解析 JSON 时使用 NSDictionary 有什么优势或好处?

python - 如何在Python中规范化复杂的嵌套json?