在我的数组的每个对象中添加一个顶部列表

时间:2018-05-20 10:46:36

标签: javascript arrays object underscore.js

我有一个包含对象列表的数组。

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

1 个答案:

答案 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' } ]
    */

感谢。