Переход к многомерным объектам в массиве

У меня есть 2 массива, и я хотел бы создать многомерный массив для каждого магазина. В результате значение «фрукт» и «овощ» не является суммой каждого из них, результатом является сумма баллов (сумма каждого фрукта или овоща * балл каждого).

var myArray = [{
                shop: "shop1",
                item1: "my apple 0",
                item2: "my carrot 1",
            }, {
                shop: "shop1",
                item1: "my apple 0",
                item2: "my carrot 1",
            }, {
                shop: "shop1",
                item1: "my apple 1",
                item2: "my carrot 0",
            },
            {
                shop: "shop2",
                item1: "my apple 1",
                item2: "my carrot 1",
            }, {
                shop: "shop2",
                item1: "my apple 1",
                item2: "my carrot 0",
            }, {
                shop: "shop2",
                item1: "my apple 0",
                item2: "my carrot 1",
            }
        ];

        var MyArrayDefinition = [{
                item: "my apple 0",
                color: "red",
                group: "fruit",
                score: 0
            }, {
                item: "my carrot 1",
                color: "orange",
                group: "vegetable",
                score: 1
            },
            {
                item: "my apple 1",
                color: "red",
                group: "fruit",
                score: 1
            }, {
                item: "my carrot 0",
                color: "orange",
                group: "vegetable",
                score: 0
            }
        ]

Это моя функция

const count = myArray
            .reduce((a, o) => a.concat(Object.values(o)), [])
            .reduce((c, v) => ({ ...c,
                [v]: (c[v] || 0) + 1
            }), {});

        const list = Object.entries(count)
            // map to {type, count}
            .map(([item, number]) => ({
                item,
                number
            }));

        const indices = MyArrayDefinition.map((e) => e.item);
        const combinaison = list.map(e => Object.assign(e, MyArrayDefinition[indices.indexOf(e.item)]));

        var result = _.map(combinaison, function(elt) {
            return ({
                item: elt.question,
                group: elt.group,
                color: elt.color,
                score: Number(elt.score),
                number: elt.number,
                totalPoints: elt.number * Number(elt.score)
            });
        });


        var resultArray = {};
        for (var i = 0; i < result.length; i++) {
            if (!resultArray.hasOwnProperty(result[i].group)) {
                resultArray[result[i].group] = 0;
            }
            resultArray[result[i].group] += result[i].totalPoints;
        };
        delete resultArray.undefined;

Хочу получить такой результат: создать объект в каждом объекте "магазин"

var resultArray = [{
                id: 1,
                shop: 'shop1',
                itemGroup: {
                    fruit: 1,
                    vegetable: 2
                }
            },
            {
                id: 2,
                shop: 'shop2',
                itemGroup: {
                    fruit: 2,
                    vegetable: 2
                }
            }
        ]

Я пробую это

var out = _(groupByShop).map(function(g, key) {
            return {
                shop: key,
                item: _(g).reduce((a, o) => a.concat(Object.values(o)), []).reduce((c, v) => ({ ...c,
                    [v]: (c[v] || 0) + 1
                }), {}),
                groupOfItems: Object.entries(_(g).reduce((a, o) => a.concat(Object.values(o)), []).reduce((c, v) => ({ ...c,
                    [v]: (c[v] || 0) + 1
                }), {})).map(([item, total]) => ({
                    item,
                    total
                }))
    };
        });

Откуда в resultArray берутся id и itemGroup? Насколько они соответствуют исходным объектам простым языком?

CertainPerformance 09.06.2018 22:47

Кажется, у shop1 есть 2 разных фрукта?

Slai 09.06.2018 23:23

Id - это индекс, а itemGroup - это новый объект, который включает фрукты и овощи. И во всех магазинах могут быть разные фрукты или овощи.

observatoire 10.06.2018 14:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не уверен, что ваш желаемый результат верен, если вам нужна сумма уникальных плодов каждого магазина, поскольку результат вашего примера кажется неправильным.

Вы можете попробовать следующее и посмотреть, подходит ли это для ваших целей, запишите в консольный журнал некоторые другие переменные (запись здесь сделает его слишком длинным).

const myArray = [{"shop":"shop1","item1":"my apple 0","item2":"my carrot 1"},{"shop":"shop1","item1":"my apple 0","item2":"my carrot 1"},{"shop":"shop1","item1":"my apple 1","item2":"my carrot 0"},{"shop":"shop2","item1":"my apple 1","item2":"my carrot 1"},{"shop":"shop2","item1":"my apple 1","item2":"my carrot 0"},{"shop":"shop2","item1":"my apple 0","item2":"my carrot 1"}];

const MyArrayDefinition = [{"item":"my apple 0","color":"red","group":"fruit","score":0},{"item":"my carrot 1","color":"orange","group":"vegetable","score":1},{"item":"my apple 1","color":"red","group":"fruit","score":1},{"item":"my carrot 0","color":"orange","group":"vegetable","score":0}];

const shopArticle = myArray.reduce(
  (result,record)=>{
    result[record.shop]=result[record.shop] || [];
    result[record.shop] = result[record.shop].concat(
      Object.keys(record).filter(key=>key.startsWith("item")).reduce(
        (r,key)=>r.concat(record[key]),
        []
      ),
      []
    );
    return result;
  },
  {}
);
const groups = MyArrayDefinition.reduce(
  (result,{item,group,score})=>{
    result[item] = {group,score};
    return result;
  },
  {}
)
console.info(
  Object.keys(shopArticle)
  .sort((a,b)=>a.localeCompare(b))
  .map(
    (key,id)=>({id:id+1,shop:key,itemGroup:shopArticle[key].reduce(
      (result,key)=>{
        result[groups[key].group] += groups[key].score;
        return result;
      },
      {fruit:0,vegetable:0}
    )})
  )
)

спасибо, но результат, который я хотел бы: магазин 1> фрукты = 1, овощи = 2 и магазин 2> фрукты = 2, овощи = 2. Я хотел бы вычислить результат, используя где-нибудь «балл» (сумма каждого уникального фрукта или овоща * их балл)

observatoire 10.06.2018 12:21

в результате значение «фрукт» и «овощ» не является суммой каждого из них, результатом является сумма баллов (сумма каждого фрукта или овоща * оценка каждого)

observatoire 10.06.2018 14:44

@observatoire обновленный ответ, общий балл для каждого магазина в каждой группе, предполагая фрукты и овощи, если у вас больше групп, вам нужно уменьшить MyArrayDefinition до объекта с группой в качестве ключа и 0 в качестве значения.

HMR 10.06.2018 18:00
Ответ принят как подходящий

Не совсем уверен, понимаю ли я часть умножения, но, похоже, соответствует результату:

var myArray = [ { shop1: "shop1", item1: "my apple 0", itemA: "my carrot 1" }, 
                { shop2: "shop1", item2: "my apple 0", itemB: "my carrot 1" }, 
                { shop3: "shop1", item3: "my apple 1", itemC: "my carrot 0" },
                { shop4: "shop2", item4: "my apple 1", itemD: "my carrot 1" }, 
                { shop5: "shop2", item5: "my apple 1", itemE: "my carrot 0" }, 
                { shop6: "shop2", item6: "my apple 0", itemF: "my carrot 1" } ];

var MyArrayDefinition = [ 
  { item: "my apple 0" , color: "red"   , group: "fruit"    , score: 0 }, 
  { item: "my carrot 1", color: "orange", group: "vegetable", score: 1 }, 
  { item: "my apple 1" , color: "red"   , group: "fruit"    , score: 1 }, 
  { item: "my carrot 0", color: "orange", group: "vegetable", score: 0 } ];

var k = Object.keys, items = MyArrayDefinition.reduce((o, v) => (o[v.item] = v, o), {}); 

var shops = myArray.reduce((o, v, i, s) => (
  s = v[k(v).find(k => k.includes('shop'))], 
  s = o[s] || (o[s] = { fruit: 0, vegetable: 0 }), 
  k(v).forEach(k => k.includes('item') && 
    (s[(i = items[v[k]]).group] += i.score) ), o), {}); 

var result = k(shops).map((k, i) => ({ id: i + 1, shop: k, itemGroup: shops[k] })); 

console.info( JSON.stringify( shops  ).replace(/},/g, '},\n ') );
console.info( JSON.stringify( result ).replace(/},/g, '},\n ') );

item1 или item2 - переменные. есть item3, item4 и т.д. Как их зациклить?

observatoire 10.06.2018 16:26

@observatoire у вас случайно не получается myArray от JSON.parse?

Slai 10.06.2018 16:28

Извините, я не понимаю ваш вопрос. Я разбираю csv с помощью dsv, и там много элементов (item1A, item1B, item2A, ... и т. д.)

observatoire 10.06.2018 16:52

Спасибо, Слай! последняя проблема для меня. Вы зацикливаете "магазин", но значение может быть "shop1", "shop2", "bigshop", "smallshop".

observatoire 10.06.2018 17:26

@observatoire слишком много изменений, так что теперь это еще больше сбивает с толку:]

Slai 10.06.2018 17:45

Другие вопросы по теме