Javascript 从对象数组中的对象创建具有唯一元素的新对象

Javascript 从对象数组中的对象创建具有唯一元素的新对象,javascript,arrays,object,javascript-objects,associative-array,Javascript,Arrays,Object,Javascript Objects,Associative Array,我有一个对象数组。此数组中的每个对象都有一些键对。其中一个键对(例如“obj”)也是一个对象数组 我拥有的示例: const arrOfObj = [ { "id": 1 "obj": { "arr1": ["arr1-1"], "arr2": ["arr2-1", "arr2-2"], "

我有一个对象数组。此数组中的每个对象都有一些键对。其中一个键对(例如“obj”)也是一个对象数组

我拥有的示例:

const arrOfObj = [
  { 
    "id": 1
    "obj": {
      "arr1": ["arr1-1"],
      "arr2": ["arr2-1", "arr2-2"],
      "arr3": ["arr3-1", "arr3-2"]
    }
  },
  { 
    "id": 1
    "obj": {
      "arr1": ["arr1-2"],
      "arr2": ["arr2-1", "arr2-3"],
      "arr3": ["arr3-1", "arr3-3"],
      "arr4": ["arr4-1"],
    }
  },
];
const newObj = {
   "arr1": ["arr1-1", "arr1-2"],
   "arr2": ["arr2-1", "arr2-2", "arr2-3"],
   "arr3": ["arr3-1", "arr3-2", "arr3-3"],
   "arr4": ["arr4-1"],
}
我需要得到“obj”对象的新对象,其中包含唯一的键和唯一的元素

我需要的示例:

const arrOfObj = [
  { 
    "id": 1
    "obj": {
      "arr1": ["arr1-1"],
      "arr2": ["arr2-1", "arr2-2"],
      "arr3": ["arr3-1", "arr3-2"]
    }
  },
  { 
    "id": 1
    "obj": {
      "arr1": ["arr1-2"],
      "arr2": ["arr2-1", "arr2-3"],
      "arr3": ["arr3-1", "arr3-3"],
      "arr4": ["arr4-1"],
    }
  },
];
const newObj = {
   "arr1": ["arr1-1", "arr1-2"],
   "arr2": ["arr2-1", "arr2-2", "arr2-3"],
   "arr3": ["arr3-1", "arr3-2", "arr3-3"],
   "arr4": ["arr4-1"],
}
所有这些都是通过请求从API动态获取的,所以我不知道这些密钥对的名称,但我需要存储它们

我有解决方案,但我是JavaScript新手,想知道如何简化和改进我糟糕的代码

1.首先,我要定义新对象,并从“arrOfObj”中检索其密钥对的名称

2.之后,我将从“arrOfObj”获取每个数组的所有元素,并将它们以相同的名称存储在密钥对中的新对象“filterObj”中

arrOfObj.forEach(function (item) {
  for (let key in item.obj) {
    for (let element = 0; element < item.obj[key].length; element++) {
      filterObj[key].push(item.obj[key][element]);
    }
  }
});
它起作用了,我已经得到了我想要的,但它看起来非常可怕。如何以最佳方式简化此代码

感谢您的帮助和建议。

使用、、和的另一种解决方案:

const arrOfObj=[{“id”:1,“obj”:{“arr1”:[“arr1-1”],“arr2”:[“arr2-1”,“arr2-2”],“arr3”:[“arr3-1”,“arr3-2”]},{“id”:1,“obj”:{“arr1”:[“arr1-2”],“arr2-3”,“arr3”:[“arr3-1”,“arr4-1”};
常数过滤器bj=
//将生成的键值对列表转换为末尾的对象
Object.fromEntries(
//将数组名称作为键,将其唯一项作为值获取映射
[…arrOfObj.reduce((map,{obj={}})=>{
//迭代当前元素的对象以更新映射
Object.entries(obj.forEach)([currentKey,CurrentValue])=>{
常量keyValues=[…(map.get(currentKey)| |[]),…currentValues];
map.set(currentKey,[…新的set(keyValues)]);
});
返回图;
},新地图)]
);

console.log(filterObj)您可以使用一些解构和Object.entries()和Object.keys()来简化此过程,并仅对新对象执行所有操作

const newObj={}
arrOfObj.forEach({obj})=>{
Object.entries(obj.forEach)([k,arr])=>{
newObj[k]=newObj[k]| |[];
newObj[k].推送(…arr);
})
});
Object.keys(newObj.forEach)(k=>newObj[k]=[…新集合(newObj[k]));
console.log(newObj)

const arrOfObj=[{id:1,obj:{arr1:[“arr1-1”]、arr2:[“arr2-1”、“arr2-2”]、arr3:[“arr3-1”、“arr3-2”]}、{id:1,obj:{arr1:[“arr1-2”]、arr2:[“arr2-1”、“arr2-3”]、arr3:[“arr3-1”、“arr3-3”]、arr4:[];

总的来说,你所拥有的并不坏,也不是意大利面代码。每一步都很容易做到。有一些快捷方式,比如迭代Object.entries(),但是能够像您所做的那样完成所有这些长手操作是很好的学习experience@charlietfl谢谢:)但我想提高我的JS技能,我完全相信所有这些都可以而且必须用更简单更好的方式来写…“更简单”。。。可能有一些技术可以将其浓缩,但如果它不像您当前拥有的那么清晰,那么您可能会发现它不可读或不可维护。一个建议是在第二步中使用
forEach()
,而不是在
loop@charlietfl明白了,再次感谢您^-^并阅读了
Object.keys()
Object.values()
Object.entries()
的工作原理非常感谢您,非常有帮助而且清晰@阿加莎,不客气。确保阅读文档以便更好地理解!非常优雅。我从这个片段中学到了很多新东西,谢谢^-^