Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据嵌套对象数组中的键组合对象数组的结果_Javascript_Arrays_Javascript Objects - Fatal编程技术网

Javascript 根据嵌套对象数组中的键组合对象数组的结果

Javascript 根据嵌套对象数组中的键组合对象数组的结果,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一个对象数组,我想在其中根据特定id过滤和合并结果。以下是示例: [ { id: 1, items: [ { id: 10, values: [11], }, { id: 20, values: [13, 14, 15], },

我有一个对象数组,我想在其中根据特定id过滤和合并结果。以下是示例:

[
    {
        id: 1,
        items: [
            {
                id: 10,
                values: [11],
            },
            {
                id: 20,
                values: [13, 14, 15],
            },
        ],
    },
    {
        id: 2,
        items: [
            {
                id: 10,
                values: [12],
            },
            {
                id: 20,
                values: [13, 15],
            },
        ],
    },
];
这是预期的结果:

[
    {
        id: 10,
        values: [11, 12],
    },
    {
        id: 20,
        values: [13, 14, 15],
    },
];
我还需要过滤重复项。谢谢

注意:如果我想要这个结果怎么办

[
    {
        // here I want value for id 10 (it will be always one number)
        value: 11,
        // here I want values for id 20 (array of numbers) => remove possible duplicates
        values: [13, 14, 15],
    },
    {
        // here I want value for id 10 (it will be always one number)
        value: 12,
        // here I want values for id 20 (array of numbers) => remove possible duplicates
        values: [13, 15],
    },
];
我用Map尝试了同样的方法,但没有成功。基本上,我希望根据ID组合值

  • 您可以在单个数组中过滤所有
  • 然后用
    数组重新创建数组。减少
    并将基于
    id的值推送到新的值对象中
  • 并使用
    Array.filter
    忽略数组上的重复值
  • Object.values
    仅返回数组格式的对象值
  • 较老的
    const arr=[{id:1,项:[{id:10,值:[11],},{id:20,值:[13,14,15],},},},},{id:2,项:[{id:10,值:[12],},{id:20,值:[13,15],},},},},];
    const res=Object.values(arr.flatMap(({items})=>items)
    .reduce((acc,{id,values})=>{
    acc[id]=acc[id]?{id,值:[]};
    //检查对象是否存在
    让newArr=acc[id]['values'].concat(值);
    设valArr=newArr.filter((v,i)=>newArr.indexOf(v)==i)
    //删除重复项
    acc[id]['values']=valArr
    返回acc
    },{}))
    
    console.log(res)
    请参阅。
    如果我想要此结果怎么办?
    您的id与您的问题不匹配。有点困惑,请解释一下你的情况more@prasanth我编辑了我的问题。你可以在我想要达到的结果中找到评论。谢谢。非常感谢您的帮助。如果您想要更快的代码,请尝试以下方法:让res=[];设map=newmap();arr.flatMap(el=>el.items).forEach(el=>{map.set(el.id,map.get(el.id)?[…map.get(el.id),…el.values]:el.values);});map.forEach((value,key)=>{res.push({id:key,value:value.filter(function(item,pos){return value.indexOf(item)==pos;})});})@moustafa Nice.,请作为答案发布,而不是评论。而且您正在使用更多的
    forEach
    循环。我不知道两者的速度差。我可以知道怎么做吗?@prasanth我编辑了这个问题,我尽力了,但我需要帮助。@marek8623检查我的最新答案。无法根据id自动拾取。因此,您将
    value的id,values
    作为参数传递<代码>检测器
    功能验证id是否存在