Javascript 计算对象数组中的重复项并按数组或对象键将其分组

Javascript 计算对象数组中的重复项并按数组或对象键将其分组,javascript,arrays,object,foreach,key,Javascript,Arrays,Object,Foreach,Key,我想把每天的所有重复值加起来,并按对象键对它们进行排序 let meals = { 'Sat Jul 11 2020': [{ fruit: "apple" }, { fruit: "apple" }, { fruit: "orange" }, { fruit: "apple" }], 'Sat Jul 04 2020': [{ fruit: "orange"

我想把每天的所有重复值加起来,并按对象键对它们进行排序

    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];
        })

    });

我想要的是这样的东西:

  'Sat Jul 11 2020': [{apple: 3, oranges: 1}],
  'Sat Jul 04 2020': [{apple: 1, oranges: 2}],
  'Fri Jul 03 2020': [{apple: 1, oranges: 3}],
我现在得到的是它将所有天数的值相加,而不是按天排序


有什么想法吗?

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

在内部,获取值数组并计算结果

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

let Founds={'Sat Jul 11 2020':[{水果:“苹果”},{水果:“橙色”},{水果:“苹果”},'Sat Jul 04 2020':[{水果:“橙色”},{水果:“苹果”},{水果:“橙色”},'Fri Jul 03 2020':[{水果:“橙色”},{水果:“橙色”},{水果:“苹果”},{水果:“橙色”},
结果=对象。fromEntries(对象
.参赛作品(膳食)
.map([key,values])=>[
钥匙
value.reduce((r,{fruit})=>{
r[水果]=(r[水果]| 0)+1;
返回r;
}, {})
])
);
控制台日志(结果)

.as-console-wrapper{max-height:100%!important;top:0;}
您真正需要的是降低每顿饭的价值。您可以通过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;
  }, {})
}