【问题标题】:Group array of objects in array of arrays -JS [closed]数组数组中的对象数组分组-JS [关闭]
【发布时间】:2020-10-15 16:11:58
【问题描述】:

我正在尝试通过对象中的 'group' 键对数组数组中的对象数组进行分组。

当前数组:

array =
[
    [{name:’a’,age:’4’,group:’15’},{name:’b’,age:’4’,group:’15’}, 
     {name:’c’,age:’4’,group:’15’}],
    [{name:’aa’,age:’6’,group:’12’},{name:’bb’,age:’6’,group:’12’}],
    [{name:’d’,age:’5’,group:’15’},{name:’e’,age:’5’,group:’15’}, 
     {name:’f’,age:’5’,group:’15’}],
    [{name:’dd’,age:’7’,group:’12’}, 
     {name:’ee’,age:’7’,group:’12’{name:’ff’,age:’7’,group:’12’}]
]

我想得到一个如下所示的数组:

newArray=  [
        {15:[[{name:’a’,age:’4’,group:’15’},{name:’b’,age:’4’,group:’15’}, 
              {name:’c’,age:’4’,group:’15’}],[{name:’d’,age:’5’,group:’15’}, 
              {name:’e’,age:’5’,group:’15’},{name:’f’,age:’5’,group:’15’}]
        },
        {12:[[{name:’aa’,age:’6’,group:’12’},{name:’bb’,age:’6’,group:’12’}],
            [{name:’dd’,age:’7’,group:’12’},{name:’ee’,age:’7’,group:’12’}, 
             {name:’ff’,age:’7’,group:’12’}]]
        }
    ]

谢谢!

【问题讨论】:

    标签: javascript arrays grouping arrayobject


    【解决方案1】:

    flat 以展平阵列。
    创建对象映射以按组和年龄分组。
    提取对象映射中每个键的单个对象,并将年龄对象解包为数组。
    年龄是数字,ES2015对整数索引进行排序,所以顺序已经按年龄排序了。

    注意:由于使用了非标准的单引号,您的 JavaScript 数据对象是无效的 JavaScript。并且您的数据中有未闭合的括号。解析为净化为 JSON 的字符串。

    res = 
    Object.entries(
    array.flat().reduce((res,x)=>{
      const {age, group} = x
      res[group] = res[group] || {}
      res[group][age] = res[group][age] || []
      res[group][age].push(x)
      return res
    },{})
    ).map(([k,v])=>({[k]: Object.values(v)}))
    
    console.log(res)
    <script>
    array =
    JSON.parse(`[
        [{name:’a’,age:’4’,group:’15’},{name:’b’,age:’4’,group:’15’}, 
         {name:’c’,age:’4’,group:’15’}],
        [{name:’aa’,age:’6’,group:’12’},{name:’bb’,age:’6’,group:’12’}],
        [{name:’d’,age:’5’,group:’15’},{name:’e’,age:’5’,group:’15’}, 
         {name:’f’,age:’5’,group:’15’}],
        [{name:’dd’,age:’7’,group:’12’}, 
         {name:’ee’,age:’7’,group:’12’},{name:’ff’,age:’7’,group:’12’}]
    ]`.replace(/’/g,'"').replace(/(name|age|group)/g,'"$1"'))
    </script>

    【讨论】:

    • 谢谢你,它成功了,你太棒了!!!!!!
    • 如果答案对您有帮助,请点击accept it as the solution旁边的复选标记
    【解决方案2】:

    你可以用Reduce做这样的事情:

    array =
    [
        [{name:'a',age:'4',group:'15'},
         {name:'b',age:'9',group:'15'}, 
         {name:'c',age:'6',group:'15'},
         {name:'c',age:'8',group:'15'},
         {name:'c',age:'4',group:'15'}],
        [{name:'aa',age:'6',group:'12'}]
    ];
    const groupByAge = (acc, elem)=>{
        acc[elem.age] = acc[elem.age]?  [...acc[elem.age],elem] : [elem];
        return acc
    }
    var res = array.reduce((acc, elem)=>{
    var key = "";
      elem.forEach(k=> {
           key  = k.group;
           acc[k.group] = acc[k.group] ?  [...acc[k.group], k] : [k];
       });
      var temp= acc[key].reduce(groupByAge, {});
      acc[key] = Object.values(temp);
      return acc
    },{});
    
    console.log([res])

    【讨论】:

    • 谢谢,但我也在寻找单独的“年龄”键
    • 我需要按组和年龄分组
    • 任何想法如何做到这一点?
    • 我在问题中添加了输入和输出。数组=输入,新数组=输出
    • key 应该是 'group' 值,value 应该是与年龄相关的数组数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多