在JavaScript中,如果两个多维对象具有相同的键值,则可以合并它们。

3

如果我有两个对象,我该如何使用第一个对象的值作为关键字从第二个对象中获取相同颜色的所有项并将其填充到第一个对象中?例如,对于以下示例,我需要第一个对象包含来自第二个对象的所有颜色与第一个对象匹配的项。

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'
  }

}

1
请澄清一下,您的意思是说,只有当第一个对象和第二个对象具有相同的颜色时,您才想要使用第二个对象中的项目来增强第一个对象? - pizzarob
@realseanp 没错,抱歉如果这让你感到困惑,英语不是我的母语。 - Suavocado
另外一个问题:object1和object2应该是数组还是对象? - unpollito
@realseanp 它以 JSON 对象的形式出现在我的面前。 - Suavocado
3个回答

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

好的,这里有些你可以做的事情。你需要指定要匹配的键和值。

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');

对我所需的功能来说非常有效,看起来非常优雅,感谢您花费时间。 - Suavocado
我不确定这是否完全符合suavocado的要求。他想要复制所有“与第一个对象具有相同颜色”的项目。从中我可以得出,object1内可能有多个项目,它们可能具有不同的颜色;在这种情况下,您需要调用mergeSameValue与您拥有的对象一样多次。 - unpollito

1
这里有另一种解决方案,从第二个对象中获取所有颜色,在第一个对象中存在的颜色。请记住,对象是通过引用传递的,因此您在这里使用浅表副本。对于这些类型的列表,使用对象而不是数组会创建一些关键冲突问题,可以通过手动索引来解决。请注意,您的颜色列表最好作为哈希映射而不是数组,这将减少较长列表中的复杂性。

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));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接