按键组合json数组,javascript

IT技术 javascript arrays json node.js algorithm
2021-03-03 07:03:24

我需要组合两个 json 数组,由两个休息服务提供。具有相同“id”的条目属于一起。

json1 = [{id:1,name:'aaa'},
     {id:5,name:'ccc'},
     {id:3,name:'bbb'}
   ];

 json2 = [{id:3,parameter1:'x', parameter2:'y', parameter3:'z'},
     {id:1,parameter1:'u', parameter2:'v', parameter3:'w'},
     {id:5,parameter1:'q', parameter2:'w', parameter3:'e'}
    ];

我需要通过以下方式在 javascript 中组合/复制/克隆 json 数组(我的模型在 angular2 中):

json3 = [{id:3,name:'bbb',parameter1:'x', parameter2:'y',   parameter3:'z'},
     {id:1,name:'aaa', parameter1:'u', parameter2:'v', parameter3:'w'},
     {id:5,name:'ccc', parameter1:'q', parameter2:'w', parameter3:'e'}
    ];

有没有办法将它们结合起来?参数名称没有准确定义,它需要使用可变参数向量。

我为每个循环尝试了混合。在我看来非常丑陋。

6个回答

两个单行:

使用 lodash:

res = _(json1).concat(json2).groupBy('id').map(_.spread(_.assign)).value();

在 ES2015 中:

res = json2.map(x => Object.assign(x, json1.find(y => y.id == x.id)));
@Joel 我刚刚使用Ramda找到了这个外部连接示例:github.com/ramda/ramda/wiki/Cookbook#sql-style-joins const joinOuter = R.curry((f1, f2, t1, t2) => { let o1 = R.indexBy(f1, t1); let o2 = R.indexBy(f2, t2); return R.values(R.mergeWith(R.merge, o1, o2)); }); // usage: joinOuter(R.prop('id'), R.prop('buyer'), people, transactions) // result: // [{ id: 1, name: 'me', buyer: 1, seller: 10 }, // { buyer: 2, seller: 5 }, // { id: 3, name: 'you' }]
2021-04-25 07:03:24
我昨晚在 8 行和大约 2 小时内为此编写了一组函数。我只使用了地图和过滤器。我他妈的怎么忘了还有其他 Array 方法?!支持 Object.assign 虽然也没有想到这一点。使用传播运算符。你的分类器更容易​​阅读。
2021-04-30 07:03:24
我已发现,Lodash溶液是完全外部连接,这意味着来自每个项目json1json2被合并到的结果-不论该项目是否也是另一个阵列英寸 Object.assign解决方案是一个左外连接,这意味着所有的项目json1进入的结果,但在项目json2被加入到结果,如果他们也存在json1有关提供真正内部联接的解决方案,请参阅此答案
2021-05-04 07:03:24
下划线是否有等价物?
2021-05-10 07:03:24
有没有办法合并来自 json2 的新项目,不仅两者都存在?
2021-05-17 07:03:24

ES2015 乔治的回答很好;

    json1 = [
    {id:1, test: 0},
    {id:2, test: 0},
    {id:3, test: 0},
    {id:4, test: 0},
    {id:5, test: 0}
];

json2 = [
    {id:1, test: 1},
    {id:3, test: 1},
    {id:5, test: 1}
];

json1.map(x => Object.assign(x, json2.find(y => y.id == x.id)));

结果:

{id:1, test: 1},
{id:2, test: 0},
{id:3, test: 1},
{id:4, test: 0},
{id:5, test: 1}
这并没有达到问题中的要求。
2021-05-12 07:03:24

如果您想编写它以便您可以接收任意数量的数组,而不仅仅是 2 个,您可以使用arguments,并执行以下操作:

var json1 = [{id:1,name:'aaa'},{id:5,name:'ccc'},{id:3,name:'bbb'}];

var json2 = [{id:3,parameter1:'x', parameter2:'y', parameter3:'z'},
             {id:1,parameter1:'u', parameter2:'v', parameter3:'w'},
             {id:5,parameter1:'q', parameter2:'w', parameter3:'e'}];

function joinObjects() {
  var idMap = {};
  // Iterate over arguments
  for(var i = 0; i < arguments.length; i++) {
    // Iterate over individual argument arrays (aka json1, json2)
    for(var j = 0; j < arguments[i].length; j++) {
      var currentID = arguments[i][j]['id'];
      if(!idMap[currentID]) {
        idMap[currentID] = {};
      }
      // Iterate over properties of objects in arrays (aka id, name, etc.)
      for(key in arguments[i][j]) {
        idMap[currentID][key] = arguments[i][j][key];
      }
    }
  }
  
  // push properties of idMap into an array
  var newArray = [];
  for(property in idMap) {
    newArray.push(idMap[property]);
  }
  return newArray;
}

var json3 = joinObjects(json1, json2);

console.log(JSON.stringify(json3));
.as-console-wrapper { max-height: 100% !important; top: 0; }

这是一个有效的代码笔。

let json1 = [
  { id: 1, name: 'aaa' },
  { id: 5, name: 'ccc' },
  { id: 3, name: 'bbb' }
];

let json2 = [
  { id: 3, parameter1: 'x', parameter2: 'y', parameter3: 'z' },
  { id: 1, parameter1: 'u', parameter2: 'v', parameter3: 'w' },
  { id: 5, parameter1: 'q', parameter2: 'w', parameter3: 'e' }
];

let result = json1.map(obj => {
  let data = json2.find(item => item.id === obj.id);
  return {...obj, ...data}
});

console.log(result);
.as-console-wrapper { top: 0; max-height: 100% !important; }

比这里的许多答案更好看。您可能希望将其设为堆栈片段
2021-05-12 07:03:24

这是一种首先构建以id(稀疏数组)为键的索引的方法,以检测和组合具有匹配id值的对象,然后最终将其连接回普通数组:

json3 = json1.concat(json2).reduce(function(index, obj) {
    if (!index[obj.id]) {
        index[obj.id] = obj;
    } else {
        for (prop in obj) {
            index[obj.id][prop] = obj[prop];
        }
    }
    return index;
}, []).filter(function(res, obj) {
    return obj;
});

如果您的浏览器支持Object.assign

json3 = json1.concat(json2).reduce(function(index, obj) {
    index[obj.id] = Object.assign({}, obj, index[obj.id]);
    return index;
}, []).filter(function(res, obj) {
    return obj;
});