【问题标题】:counting duplicates in object array and grouping them by array or object key计算对象数组中的重复项并按数组或对象键对它们进行分组
【发布时间】:2020-10-24 11:21:08
【问题描述】:

我想将每一天的所有重复值加起来并按对象键对其进行排序

    let meals = {
        'Sat Jul 11 2020': [{ fruit: "apple" }, { fruit: "apple" }, { fruit: "orange" }, { fruit: "apple" }],
        'Sat Jul 04 2020': [{ fruit: "orange" }, { fruit: "apple" }, { fruit: "orange" }],
        'Fri Jul 03 2020': [{ fruit: "orange" }, { fruit: "orange" }, { fruit: "apple" }, { fruit: "orange" }]
    }

    let keys = Object.keys(meals);

    let food = keys.map(item => {
        return meals[item].map((x) => {
            return x.fruit
        });
    });

    var sorted ={};

    food.forEach(i => {
        i.map((x) => {
            return [sorted[x] = (sorted[x] || 0) + 1];
        })

    });

JsFiddle

我追求的是这样的:

  'Sat Jul 11 2020': [{apple: 3, oranges: 1}],
  'Sat Jul 04 2020': [{apple: 1, oranges: 2}],
  'Fri Jul 03 2020': [{apple: 1, oranges: 3}],

我现在得到的是它把所有天的值加起来,而不是按天排序

有什么想法吗?

【问题讨论】:

    标签: javascript arrays object foreach key


    【解决方案1】:

    您真正需要的只是降低每餐的价值。您可以通过 Nina Sholz 前面介绍的方法完成此操作,也可以使用简单的for of 循环来获取每餐的价值:

    for (const [key, value] of Object.entries(meals)) {
        // key is our date string
        // value is our array of fruits
    }
    

    现在我们有了每个键/值,我们只需要将value 中的水果数组减少为一个对象:

    const sorted = {}
    
    for (const [key, value] of Object.entries(meals)) {
        sorted[key] = value.reduce((accumulator, current) => {
            const fruitOnObj = current.fruit; // "apple" or "orange" in this case
        
            // Add to our property on our sorted constant
            accumulator[fruitOnObj] = (accumulator[fruitOnObj] || 0) + 1;
    
            // Return our modified accumulator from the reducer function
            return accumulator;
      }, {})
    }
    

    JSFiddle

    【讨论】:

      【解决方案2】:

      您可以获取对象的条目并映射新条目以获取对象。

      在里面取出 values 数组并计算水果。

      这种方法返回一个对象,而不是一个包装在数组中的对象。

      let meals = { 'Sat Jul 11 2020': [{ fruit: "apple" }, { fruit: "apple" }, { fruit: "orange" }, { fruit: "apple" }], 'Sat Jul 04 2020': [{ fruit: "orange" }, { fruit: "apple" }, { fruit: "orange" }], 'Fri Jul 03 2020': [{ fruit: "orange" }, { fruit: "orange" }, { fruit: "apple" }, { fruit: "orange" }] },
          result = Object.fromEntries(Object
              .entries(meals)
              .map(([key, values]) => [
                  key,
                  values.reduce((r, { fruit }) => {
                      r[fruit] = (r[fruit] || 0) + 1;
                      return r;
                  }, {})
              ])
          );
      
      console.log(result);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        猜你喜欢
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 2018-11-27
        • 2021-11-19
        • 2022-06-22
        • 1970-01-01
        相关资源
        最近更新 更多