У меня есть 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
}))
};
});
Кажется, у shop1 есть 2 разных фрукта?
Id - это индекс, а itemGroup - это новый объект, который включает фрукты и овощи. И во всех магазинах могут быть разные фрукты или овощи.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не уверен, что ваш желаемый результат верен, если вам нужна сумма уникальных плодов каждого магазина, поскольку результат вашего примера кажется неправильным.
Вы можете попробовать следующее и посмотреть, подходит ли это для ваших целей, запишите в консольный журнал некоторые другие переменные (запись здесь сделает его слишком длинным).
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 обновленный ответ, общий балл для каждого магазина в каждой группе, предполагая фрукты и овощи, если у вас больше групп, вам нужно уменьшить MyArrayDefinition до объекта с группой в качестве ключа и 0 в качестве значения.
Не совсем уверен, понимаю ли я часть умножения, но, похоже, соответствует результату:
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 у вас случайно не получается myArray от JSON.parse?
Извините, я не понимаю ваш вопрос. Я разбираю csv с помощью dsv, и там много элементов (item1A, item1B, item2A, ... и т. д.)
Спасибо, Слай! последняя проблема для меня. Вы зацикливаете "магазин", но значение может быть "shop1", "shop2", "bigshop", "smallshop".
@observatoire слишком много изменений, так что теперь это еще больше сбивает с толку:]
Откуда в
resultArrayберутсяidиitemGroup? Насколько они соответствуют исходным объектам простым языком?