如果两个多维对象在javascript中具有相同的键值,则将它们合并

时间:2015-12-09 20:53:09

标签: javascript

如果我有两个对象。如何使用第一个对象的值将第一个对象用第二个对象填充?假设对于以下示例,我需要第一个对象来包含第二个对象中与第一个对象具有相同颜色的所有项目。

object1 = {
  1:{
    name:'bed',
    color:'blue'
  }
}


object2 = {
  1:{
    name:'chair',
    color:'blue'
  },

  2:{
    name:'table',
    color:'red'
  }
}

所以这应该导致

object1 = {

  1:{
    name:'bed',
    color:'blue'
  },

  2:{
    name:'chair',
    color:'blue'
  }

}

3 个答案:

答案 0 :(得分:2)

// Store all the colours in object1 inside an array
var colours = [];
var object1_keys = Object.keys(object1);
object1_keys.map(function(key)
{
    if (colours.indexOf(object1[key].color) === -1)
    {
        colours.push(object1[key].color);
    }
});

var last_index = object1_keys.length;

// Copy all the items from object2 into object1 if their colour
// is inside the colours array
var object2_keys = Object.keys(object2);
object2_keys.map(function(key)
{
    if (colours.indexOf(object2[key].color) > -1)
    {
        last_index++;
        object1[last_index] = object2[key];
    }
});

由于你没有数组,但是有一个类似数组索引的对象,我正在使用一个名为“last_index”的变量来知道我们需要为object1中的新项设置的索引。如果您使用的是数组,逻辑会更简单。

编辑:我的解决方案和realsenanp之间的主要区别在于他只合并了一种颜色的项目。如果object1中有多种颜色,我建议的解决方案可能会更有效。

答案 1 :(得分:1)

这是你可以做的事情。您可以指定要匹配的键和值。

var object1 = {
  1:{
    name:'bed',
    color:'blue'
  }
};


var object2 = {
  1:{
    name:'chair',
    color:'blue'
  },

  2:{
    name:'table',
    color:'red'
  }
};

// a - object1
// b - object2
// key - key you want to match
// value - value of key that must be matched
var mergeSameValue = function(a, b, key, value){
  var count = 1;
  for(var c in a){
    if(a.hasOwnProperty(c)){
      count ++;
    }
  }
  for(var i in b){
    if(b[i][key] === value){
      a[count] = b[i]
      count ++;
    }
  }
  return a
};

// Your new object with both objects merged
var newObj = mergeSameValue(object1, object2, 'color', 'blue');

答案 2 :(得分:1)

这是另一个从第二个对象获取所有对象的解决方案,第一个对象中的任何对象都存在颜色。

请记住,对象是通过引用传递的,所以你在这里使用浅拷贝。

使用对象代替Arrays来处理这些类型的列表会产生一些关键的冲突问题,但需要通过手动索引来解决。

请注意,您的颜色列表最好用作散列映射,而不是数组,这样可以降低较长列表的复杂性。

function colorMap (obj) {
  var map = {};
  
  Object.keys(obj).forEach(function (key) {
    map[obj[key].color] = true;
  });
  
  return map;
}

function merge (one, two) {
  var map = colorMap(one),
      index = Object.keys(one).length;
  
  Object.keys(two).forEach(function (key) {
    if (map[two[key].color]) one[++index] = two[key];
  });
  
  return one;
}

// 

var object1 = {
  1:{
    name:'bed',
    color:'blue'
  }
},

object2 = {
  1:{
    name:'chair',
    color:'blue'
  },

  2:{
    name:'table',
    color:'red'
  }
};


console.log(merge(object1, object2));