【问题标题】:how to combine two array of Objects in javascript without using Underscore or Lodash?如何在不使用下划线或 Lodash 的情况下在 javascript 中组合两个对象数组?
【发布时间】:2018-01-15 22:36:11
【问题描述】:

我有两个数组

var a=[
  {_id:1,name:'a'},
  {_id:2,name:'b'},
  {_id:3,name:'c'},
]

var b=[
  {key:1,dis:0.5},
  {key:2,dis:0.9},
  {key:3,dis:10}
]

从这里有 _id 和 key ,我想要的是如果 _id 和 key 与我想要一个看起来像这样的数组相同

var result=[
  {_id:1,name:'a',dis:0.5},
  {_id:2,name:'b',dis:0.9},
  {_id:3,name:'c',dis:1},   
]

注意:我不想使用任何类似 _.map 或 _.extend 的 _ 函数

谢谢

【问题讨论】:

  • 两者都不同 @Rajesh 先看后评论
  • 请展示您尝试过的内容。 Stackoverflow 不是免费的代码编写服务。目标是帮助您修复您的代码
  • @kumbhanibhavesh 我很抱歉。你的标题误导了我。我收回了我的投票,但正确的标题是将对象合并到 2 个对象中,对于不同的键具有相同的值。此外,由于您的问题没有表现出努力,我们没有问题陈述。这是一个要求。所以我要求你分享你的代码以及你在哪里卡住了。
  • @kumbhanibhavesh 您编写了输入和输出格式。这是一个要求。代码是您尝试自己实现但失败的东西。也请注意语气。

标签: javascript node.js


【解决方案1】:

您可以将哈希表用于相同的标识符。哈希表包含结果集新生成的对象。

首先,创建和映射一个新对象,并将其存储在哈希表中。然后在另一个数组的第二个循环中,将缺失的属性添加到对象中。

结果是一个包含新对象的数组。

var a = [{ _id: 1, name: 'a' }, { _id: 2, name: 'b' }, { _id: 3, name: 'c' }],
    b = [{ key: 1, dis: 0.5 }, { key: 2, dis: 0.9 }, { key: 3, dis: 10 }, { key: 4, dis: 42 }],
    hash = Object.create(null),
    result = a.map(function (o) {
        return hash[o._id] = { _id: o._id, name: o.name };
    });
    
b.forEach(function (o) {
    if (!hash[o.key]) {
        result.push(hash[o.key] = { _id: o.key, name: 'unknown' });
    }
    hash[o.key].dis = o.dis;
});

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

【讨论】:

  • 我们真的应该回答这样的问题吗?这是一项要求,而不是问题陈述。但考虑到这是一种自以为是的行动,我会投票。
  • 您能解释一下您的代码吗,我从未使用过哈希表?谢谢
【解决方案2】:

这是array#find 和array#map 的解决方案

var a=[
  {_id:1,name:'a'},
  {_id:2,name:'b'},
  {_id:3,name:'c'},
]

var b=[
  {key:1,dis:0.5},
  {key:2,dis:0.9},
  {key:3,dis:10}
]

var merged = a.map(o => {
  let temp = b.find(obj => obj.key === o._id);
  let res = Object.assign(o,temp);
  delete res.key;
  return res;
});

console.log(merged);

【讨论】:

  • 如果您希望只有 1 个值,请使用 array.find 而不是 array.filter
  • 一个优雅而现代的解决方案,这几乎正是我要写的,但我没有考虑使用删除。这是一个很好的接触。 编辑:很好的@Rajesh,我现在将开始更频繁地使用array.find!
【解决方案3】:

简单使用如下

var result = [];
for(var i = 0; i <= a.length-1; i++){
     for(var j = 0; i <= b.length-1; j++){
         if(a[i]._id == b[j].key){
          result.push(id: a[i]._id, name: a[i].name, dis: b[j].dis)
         }
     }
}
console.log(result);

【讨论】:

    【解决方案4】:

    试试这个:

        if (a.length&& b.length) {
            for (var i = 0; i < a.length; i++) {
                for (var j = 0; j < b.length; j++) {
                    if (a[i]._id == b[j].key) {
                        a[i].dis = b[j].dis;
                    }
                }
            }
        }
    
        console.log(a);
    

    或

        var result = [];
    
        if (a.length&& b.length) {
            for (var i = 0; i < a.length; i++) {
                var obj = {
                    _id: a[i]._id,
                    name: a[i].name,
                    dis: ""
                }
                for (var j = 0; j < b.length; j++) {
                    if (a[i]._id == b[j].key) {
                        obj.dis = b[j].dis;
                    }
                }
                result.push(obj);
            }
        }
    
        console.log(result);
    

    【讨论】:

      【解决方案5】:

      AFAIK 这是 O(N) 而不是 O(N^2) 像大多数其他答案一样......

      var a = [{
          _id: 1,
          name: 'a'
      }, {
          _id: 2,
          name: 'b'
      }, {
          _id: 3,
          name: 'c'
      }]
      
      var b = [{
          key: 1,
          dis: 0.5
      }, {
          key: 2,
          dis: 0.9
      }, {
          key: 3,
          dis: 10
      }]
      
      function merge(a, b) {
          const bKeys = b.reduce((p, c) => (p.set(c.key, c), p), new Map);
          return a.map(o=>Object.assign({}, o, bKeys.get(o._id) ));
      
      }
      
      console.log(merge(a, b));

      【讨论】:

        【解决方案6】:
        var res = a.map(function(e, i){
            e.dis = b.find(function(eb){return eb.key == e._id;}).dis;
            return e;
        });
        

        // res : [{"_id":1,"name":"a","dis":0.5},{"_id":2,"name":"b","dis":0.9 },{"_id":3,"name":"c","dis":10}]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-06
          • 2018-09-14
          • 2015-05-13
          • 2023-03-28
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多