Javascript 如何相对于公共密钥将特定密钥合并到另一个对象?

Javascript 如何相对于公共密钥将特定密钥合并到另一个对象?,javascript,node.js,Javascript,Node.js,我有一个数组,它有许多记录。需要根据条件合并对象(不适用于数组中的所有可用对象),在这种情况下,首先需要将数据与名称进行比较。 步骤1:需要在数组中查找具有相似名称的对象。 步骤2:如果我们有相同的数据,接下来比较匹配数据中的状态键。 第三步: 案例1:如果匹配数据中的任何一个对象的状态为true(设置状态:true),则需要合并该对象的所有likings键。 案例2:如果匹配数据中的所有对象的状态都为false,则(设置状态:false)需要将所有likings键合并到任何对象。 如何做到这一

我有一个数组,它有许多记录。需要根据条件合并对象(不适用于数组中的所有可用对象),在这种情况下,首先需要将数据与名称进行比较。
步骤1:需要在数组中查找具有相似名称的对象。
步骤2:如果我们有相同的数据,接下来比较匹配数据中的状态键。
第三步:
案例1:如果匹配数据中的任何一个对象的状态为true(设置状态:true),则需要合并该对象的所有likings键。 案例2:如果匹配数据中的所有对象的状态都为false,则(设置状态:false)需要将所有likings键合并到任何对象。
如何做到这一点

排列

预期o/p

[
  {
    name: 'jane',
    age: 10,
    status: true,
    likings: [
      { sports: 'football', books: 'harrypotter' },
      { sports: 'gaming', books: 'book4' },
      { sports: 'chess', books: 'book2' },
    ],
  },
  {
    name: 'sam',
    age: 20,
    status: false,
    likings: [{ sports: 'basketball', books: 'book1' }],
  },
  {
    name: 'robert',
    age: 40,
    status: false,
    likings: [{ sports: 'carrom', books: 'book3' }],
  },
];

我不认为我完全理解你的要求,尤其是关于“相似的名字”。因此,我假设您希望根据“名称”对记录进行分组,所有具有相同“名称”的记录将具有相同的“年龄”

下面的解决方案是使用对象
hash
对记录进行分组,并将
likings
连接到元素中。完成后,通过调用
object.values()
返回对象的所有元素,该函数应保持名称的出现顺序

这是你想要的,或者至少给你一些想法?希望能有帮助

函数合并(记录){
常量哈希={};
for(设i=0;i
您可以使用
.reduce()
将具有相同名称的所有对象合并到
映射中。这可以通过保留
名称
的键以及具有该名称的对象的值的映射来实现。每当在阵列中遇到新对象时,都可以检查它是否存在于地图中。如果有,您可以添加到存储在关联对象中的
likings
数组中。如果当前对象为
true
,则还可以将状态更新为
true
。如果对象的名称在地图中不作为键存在,则可以将该对象作为值添加,该值可在
reduce
的后续迭代中进一步合并

见下例:

const arr=[{name:'jane',年龄:10岁,状态:true,爱好:[{sports:'football',books:'harrypotter'}],},{name:'sam',年龄:20岁,状态:false,爱好:[{sports:'basketball',book1'},},{name:'jane',年龄:10岁,状态:false,爱好:[{sports:'chess:'book2'},},{姓名:'robert',年龄:40岁,状态:false,喜好:[{体育:'carrom',书籍:'book3'}],},{姓名:'jane',年龄:10岁,状态:false,喜好:[{体育:'gaming',书籍:'book4'}],},{姓名:'sam年龄:10岁,状态:false,喜好:[{体育:'gaming',book5'}],}];
const merged=[…arr.reduce((m,o)=>{
const curr=m.get(o.name)|{};
返回m.set(o.name,{…o,status:curr.status | | | o.status,likings:[…(curr&&curr.likings | |[]),…o.likings];
},新映射)。值()]

console.log(合并);
嘿,谢谢,@senta除了一个场景外,它工作得很好。当status为false但status key在对象中不可用时,它是分组likings key。@muthu,对不起,我修复了这个bug。
status:(hash[key]&&hash[key].status)|元素。status
是更改。
[
  {
    name: 'jane',
    age: 10,
    status: true,
    likings: [
      { sports: 'football', books: 'harrypotter' },
      { sports: 'gaming', books: 'book4' },
      { sports: 'chess', books: 'book2' },
    ],
  },
  {
    name: 'sam',
    age: 20,
    status: false,
    likings: [{ sports: 'basketball', books: 'book1' }],
  },
  {
    name: 'robert',
    age: 40,
    status: false,
    likings: [{ sports: 'carrom', books: 'book3' }],
  },
];