Javascript 合并两个键不同但值相同的无序对象?

Javascript 合并两个键不同但值相同的无序对象?,javascript,arrays,sorting,Javascript,Arrays,Sorting,合并对象,如obj1和obj2,以获得javascript中的obj3 obj1 = [{fruit: 'watermelon', sweetness: 3},{fruit: 'banana', sweetness: 4},{fruit: 'apple', sweetness: 5}] obj2 = [{fruit_name: 'apple', color: 'red'},{fruit_name: 'banana', color:'yellow'},{fruit_name: 'watermelo

合并对象,如obj1和obj2,以获得javascript中的obj3

obj1 = [{fruit: 'watermelon', sweetness: 3},{fruit: 'banana', sweetness: 4},{fruit: 'apple', sweetness: 5}]
obj2 = [{fruit_name: 'apple', color: 'red'},{fruit_name: 'banana', color:'yellow'},{fruit_name: 'watermelon', color:'green'}]

obj3 = [{fruit_name: 'apple', color: 'red', sweetness: 5},{fruit_name: 'banana', color:'yellow', sweetness: 4},{fruit_name: 'watermelon', color:'green', sweetness: 3}]

您的数据结构不正确。不能将“'fruit:'西瓜'”(键、值对)保存在数组中

它将给出一个错误:
未捕获的语法错误:意外的标记:

我假设你想做的是:

obj1=[{水果:西瓜,甜度:3},{水果:香蕉,甜度:4},{水果:苹果,甜度:5}]
obj2=[{水果名称:'苹果',颜色:'红色'},{水果名称:'香蕉',颜色:'黄色'},{水果名称:'西瓜',颜色:'绿色'}]
obj3=[];
对于(i=0;i
您可以首先通过使用合并类似对象来创建一个
哈希表,然后使用函数提取所需的数组-请参见下面的演示:

var obj1=[{水果:西瓜,甜度:3},{水果:香蕉,甜度:4},{水果:苹果,甜度:5}],
obj2=[{水果名称:'apple',颜色:'red'},{水果名称:'banana',颜色:'yellow'},{水果名称:'西瓜',颜色:'green'}],hash={};
//函数创建哈希表
功能分类(e){
if(散列[e.fruit]| |散列[e.fruit_name]){
对象。键(e)。forEach(函数(c){
hash[e.fruit | | e.fruit_name][c]=e[c];
});
}否则{
hash[e.fruit|u name | e.fruit]=e;
}
}
//添加到散列
obj1.forEach(分类);
对象J2.forEach(分类);
//提取结果
var obj3=Object.keys(hash.map)(函数(e){
删除散列[e]['fruit'];
返回散列[e];
});
控制台日志(obj3)

.as console wrapper{top:0;max height:100%!important;}
将两个对象数组合并到一个共享键中非常简单。最简单的方法是使用基于关联数组的映射,如下所示。请注意,您可以使用此例程来解决任何类似类型的问题,但它肯定适用于您的数据——请参阅最后链接的JSFIDLE

(ETA:共享密钥只添加一次,名称为key1;如果希望第二个密钥在输出中结束,只需将参数对交换给函数即可。)

obj1=[{水果:西瓜,甜度:3},{水果:香蕉,甜度:4},{水果:苹果,甜度:5}];
obj2=[{水果名称:'苹果',颜色:'红色'},{水果名称:'香蕉',颜色:'黄色'},{水果名称:'西瓜',颜色:'绿色'}];
函数mergeObjectArrays(array1,key1,array2,key2){
var-map=[];//关联数组/哈希表
var arrayValue、mapValue、propertyName、propertyName、propertyValue;
//1.循环一个数组,用每个对象的指定键填充映射
对于(变量x=0;x

不是一个通用的解决方案,但足以满足您的情况:

var obj1=[{水果:西瓜,甜度:3},{水果:香蕉,甜度:4},{水果:苹果,甜度:5}]
var obj2=[{水果名称:'苹果',颜色:'红色'},{水果名称:'香蕉',颜色:'黄色'},{水果名称:'西瓜',颜色:'绿色'}]
var obj3=obj2.map(o=>Object.assign({},o,{'sweetness':obj1.find(p=>p.fruit==o.fruit\u name.sweetness}))

console.log(obj3)
您的“对象”示例在语法上不正确。您是否打算将其与大括号类型
{
/
[
swapped?是的,我不小心交换了它们。你的问题是什么?你只发布了一条指令。你自己尝试过解决这个问题吗?我修复了这个示例,这也是一个很好的解决方案。谢谢,这将适用于所有类似的数据结构-你只需要知道唯一标识数组中元素的键(这里是
fruit
fruit\u name
)…我非常喜欢这个解决方案,因为它很简单,我正在积极使用它。但是,我有一个问题,因为它没有捕获两个具有相同键值的项。例如:{fruit\u name:'apple',color:'red'},{fruit\u name:'apple',color:'green'}。它将只列出最后一个(在本例中为绿色).关于这个问题,我还有一个问题要问:我的解决方案是通用的,但对于2个阵列的情况来说太浪费了…你甚至可以用它来缩短代码长度。这个一行解决方案很漂亮,因为我试图使用嵌套for循环来解决这个问题。我在这里问的是寻找一个更优雅的解决方案,就是这样。
let obj1 = [{fruit: 'watermelon', sweetness: 3},{fruit: 'banana', sweetness: 4},{fruit: 'apple', sweetness: 5}];
let obj2 = [{fruit_name: 'apple', color: 'red'},{fruit_name: 'banana', color:'yellow'},{fruit_name: 'watermelon', color:'green'}];

function regulate(a) {
  return a.map(v => {
    if (v.fruit) {
        v.fruit_name = v.fruit;
        delete v.fruit;
     }
     return v;
  });
}


let a = [].concat(regulate(obj1), regulate(obj2));

let merged = [];
a.reduce((m, v) => {
  let f = m.filter(v2 => v2.fruit_name === v.fruit_name);
  if (f.length > 0) {
    Object.assign(f[0], v);
  } else {
    m.push(v);
  }
  return m;
}, merged);

console.log(merged);
obj1 = [{fruit: 'watermelon', sweetness: 3},{fruit: 'banana', sweetness: 4},{fruit: 'apple', sweetness: 5}];
obj2 = [{fruit_name: 'apple', color: 'red'},{fruit_name: 'banana', color:'yellow'},{fruit_name: 'watermelon', color:'green'}];

function mergeObjectArrays(array1, key1, array2, key2) {
  var map = []; // an associative array/hashtable
  var arrayValue, mapValue, propertyNames, propertyName, propertyValue;

  // 1. Loop over one array, populating the map by each object's specified key
    for(var x = 0; x < array1.length; x++) {
    array1Value = array1[x];
    map[array1Value[key1]] = array1Value;
    map.push(array1Value);
  }

  // 2. Loop over the other array, matching on the provided keys
  for(var x = 0; x < array2.length; x++) {
    arrayValue = array2[x];
    mapValue = map[arrayValue[key2]];

    if (typeof(mapValue) != 'undefined') { // add all missing non-keyed properties to the mapped/merged object
      propertyNames = Object.keys(arrayValue);
      for (var y = 0; y < propertyNames.length; y++) {
          propertyName = propertyNames[y];
          if (propertyName != key1 && propertyName != key2) { // .. as that shared value is already added
            propertyValue = arrayValue[propertyName];
            mapValue[propertyName] = propertyValue;
          }
      }      
    }
    else { // it's missing from the mapping, so at least add it though it will be missing array1 data
      map[arrayValue[key2]] = arrayValue;
      map.push(arrayValue);
    }
  }

  return map;
}

var mergedArrays = mergeObjectArrays(obj1, 'fruit', obj2, 'fruit_name');