我有一个包含对象列表的数组。
var myArray = [
{Color:"red", Fruit:"apple", Country:"us", Value:1},
{Color:"red", Fruit:"cherry", Country:"us", Value:1},
{Color:"red", Fruit:"apple", Country:"italy", Value:1},
{Color:"red", Fruit:"apple", Country:"italy", Value:2},
{Color:"red", Fruit:"strawberry", Country:"italy", Value:2},
{Color:"red", Fruit:"cherry", Country:"italy", Value:1},
{Color:"yellow", Fruit:"banana", Country:"us", Value:1},
{Color:"yellow", Fruit:"banana", Country:"italy", Value:1},
{Color:"yellow", Fruit:"pineapple", Country:"italy", Value:5},
{Color:"yellow", Fruit:"mango", Country:"italy", Value:3},
];
此功能按颜色对所有水果进行分组。我想在我的数组groupColor的每个对象中添加一个顶部列表(Top2)。 "最上方的两个"是价值最重要的两个水果(顺序也很重要)。
var groupColor = _(_.where(myArray, { Country: "italy", })).groupBy("Color");
var myNewArray=_(groupColor).map(function(g, key) {
return {
Color: key || 0,
Total: _(g).reduce(function(m, x) {
return m + x.Value;
}, 0),
};
});
我想要一个像这样的数组
var myNewArray = [
{ Color: "red", Total: 6, top2:"apple, strawberry" },
{ Color: "yellow", Total: 9, top2:"pineapple,mango" },
];
最后我已经解决了这个问题
var ArraySelectCountry = _(_.where(myArray, {Country: "italy"}));
var ObjectsGrouped = _(ArraySelectCountry).chain()
.groupBy(function (itm) {
return itm.Color + itm.Fruit ;
}) // group by Metier & Genre
.map(function (itm, key) { // for every grouped item
// we sum up the values OnTime
var sum = _(itm).chain()
.pluck("Value")
.reduce(function (memo, value) {
return memo = memo + Number(value);
}, 0.0)
.value();
return _.object(["Color", "Fruit", "Value"], [itm[0].Color, itm[0].Fruit, sum])
})
.value();
var ObjectsGrouped= _.sortBy(ObjectsGrouped, function(o) { return o.Value; }).reverse();
var ObjectsGroupedByColor = _(ObjectsGrouped).groupBy('Color');
var myNewArray = _(ObjectsGroupedByColor).map(function(g, key) {
return {
Color: key,
Value: _(g).reduce(function(m,x) { return m + x.Value; }, 0) ,
Liste: _.uniq(_.pluck(_.where(ObjectsGrouped, {Color: key}),"Fruit"))
};
});
答案 0 :(得分:0)
@observatoire ,根据您的要求,我编写了以下脚本,它运行良好,并提供您在问题中指定的输出。
»您可以根据自己的要求复制和修改代码。我编写的代码是特定于当前需求的,并且大多数行都被注释。
»如果您在阅读代码时遇到任何问题,可以发表评论。
// https://stackoverflow.com/questions/50434025/add-a-top-list-in-each-object-of-my-array
var myNewArray = []
var newObj = {}
var colors = []
var fruitNames = []
var myArray = [
{Color:"red", Fruit:"apple", Country:"us", Value:1},
{Color:"red", Fruit:"cherry", Country:"us", Value:1},
{Color:"red", Fruit:"apple", Country:"italy", Value:1},
{Color:"red", Fruit:"apple", Country:"italy", Value:2},
{Color:"red", Fruit:"strawberry", Country:"italy", Value:2},
{Color:"red", Fruit:"cherry", Country:"italy", Value:1},
{Color:"yellow", Fruit:"banana", Country:"us", Value:1},
{Color:"yellow", Fruit:"banana", Country:"italy", Value:1},
{Color:"yellow", Fruit:"pineapple", Country:"italy", Value:5},
{Color:"yellow", Fruit:"mango", Country:"italy", Value:3},
];
for(let obj of myArray) {
var color = obj.Color;
// Add color as key of obj that points list of objects of same color
if(newObj[color] === undefined) {
// Create new
newObj[color] = {}
newObj[color].fruits = []
newObj[color].fruitNames = []
colors.push(color)
newObj[color]['fruits'].push(obj)
newObj[color].fruitNames.push(obj.Fruit)
newObj[color]['values'] = [obj.Value]
} else {
// Push fruit
newObj[color].fruits.push(obj);
newObj[color]['fruitNames'].push(obj.Fruit)
// Checking values (Creating a list of unique values)
// if(newObj[color]['values'].indexOf(obj.Value) < 0) {
newObj[color]['values'].push(obj.Value)
// }
}
}
// Printing array of unique colors
// console.log(colors);
/*
[ 'red', 'yellow' ]
*/
// Sort colors array
colors = colors.sort()
// Pretty printing object
// Uncomment below line to see prettified JSON
// console.log(JSON.stringify(newObj, null, 4));
/*
{
"red": {
"fruits": [
{
"Color": "red",
"Fruit": "apple",
"Country": "us",
"Value": 1
},
{
"Color": "red",
"Fruit": "cherry",
"Country": "us",
"Value": 1
},
{
"Color": "red",
"Fruit": "apple",
"Country": "italy",
"Value": 1
},
{
"Color": "red",
"Fruit": "apple",
"Country": "italy",
"Value": 2
},
{
"Color": "red",
"Fruit": "strawberry",
"Country": "italy",
"Value": 2
},
{
"Color": "red",
"Fruit": "cherry",
"Country": "italy",
"Value": 1
}
],
"fruitNames": [
"apple",
"cherry",
"apple",
"apple",
"strawberry",
"cherry"
],
"values": [
1,
1,
1,
2,
2,
1
]
},
"yellow": {
"fruits": [
{
"Color": "yellow",
"Fruit": "banana",
"Country": "us",
"Value": 1
},
{
"Color": "yellow",
"Fruit": "banana",
"Country": "italy",
"Value": 1
},
{
"Color": "yellow",
"Fruit": "pineapple",
"Country": "italy",
"Value": 5
},
{
"Color": "yellow",
"Fruit": "mango",
"Country": "italy",
"Value": 3
}
],
"fruitNames": [
"banana",
"banana",
"pineapple",
"mango"
],
"values": [
1,
1,
5,
3
]
}
}
[ { Color: 'red', Total: 6, top2: 'apple,strawberry' },
{ Color: 'yellow', Total: 4, top2: 'pineapple,mango' } ]
*/
for(let color in newObj) {
let item = {}
item.Color = color
item.Total = newObj[color]['fruits'].length
topFruits = []
var count = 2
while(item.Total > 0 && count > 0) {
let maxValue = newObj[color].values.reduce(function(accumulator, currentValue, currentIndex, array) {
return Math.max(accumulator, currentValue)
})
let maxIndex = newObj[color].values.indexOf(maxValue)
let maxFruitName = newObj[color].fruitNames[maxIndex]
topFruits.push(maxFruitName)
newObj[color].values.splice(maxIndex, 1)
newObj[color].fruitNames.splice(maxIndex, 1)
count -= 1;
}
item.top2 = "" + topFruits
myNewArray.push(item)
}
console.log(myNewArray)
/*
[ { Color: 'red', Total: 6, top2: 'apple,strawberry' },
{ Color: 'yellow', Total: 4, top2: 'pineapple,mango' } ]
*/
感谢。