计算Javascript对象数组中的重复对象

时间:2014-01-31 19:50:58

标签: javascript jquery json multidimensional-array

我正在尝试解析Javascript对象的子对象以计算相同的子对象的数量,并返回具有这些计数的新JSON对象。这可能不太清楚,所以这里是fiddle

考虑到小提琴中的crsListData,我想回复一下:

objToReturn = [
            {
                key: "Consigned",
                values:
                    [
                        { mapKey: 2007 (4), mapVal: [["Ford F-150 (3)"], ["Honda Civic (1)"]] },
                        { mapKey: 2011 (1), mapVal: "Toyota Camry (1)" },
                        { mapKey: 2005 (1), mapVal: "Dodge RAM (1)" }
                    ]
            },
            {
                key: "Run",
                values:
                    [
                        { mapKey: 2007 (2), mapVal: "Ford F-150 (2)" },
                        { mapKey: 2011 (1), mapVal: "Toyota Camry (1)" }
                    ]
            },
            {
                key: "Sold",
                values:
                    [
                        { mapKey: 2007 (1), mapVal: "Ford F-150 (1)" },
                        { mapKey: 2011 (1), mapVal: "Toyota Camry (1)" }
                    ]
            }
        ];

如果您在小提琴中注意到,我已经评论了关于mapKey和mapValue的部分内容。它们将由从选择选项获得的函数参数确定,按模型(计数)/年份(计数)或年份(计数)/模型(计数)排序。

我的最终目标是生成一个基本上如下所示的HTML树:

  1. 寄售(寄售#)

    • 2007(2007款车型总数)
      • 型号1(计数)
      • 型号2(计数)
    • 2011(2007款车型总数)
  2. 运行(运行#)

    • 2007(2007款车型总数)
      • 型号1(计数)
      • 型号2(计数)
    • 2011(2007款车型总数)
  3. 已售出(与上述相同)
  4. 年份的顺序应基于该年度的模型总数(最高#先)。同样,多年来模型的顺序应按最高计数排序。

    或者,如果用户选择模型/年份进行分组,我想生成:

    1. 寄售(寄售#)

      • Model1(所有年份此型号的总数)
        • 第1年(今年的模特数)
        • 第2年(今年的模特数)
      • Model2(所有年份此型号的总数)
    2. 运行(运行#)

      • Model1(所有年份此型号的总数)
        • 第1年(今年的模特数)
        • 第2年(今年的模特数)
      • Model2(所有年份此型号的总数)
    3. 已售出(与上述相同)
    4. 这个的顺序也将基于计数。如果您需要任何澄清,请告诉我!谢谢!

1 个答案:

答案 0 :(得分:4)

您想要做的事情的根本很简单。您想要按某些属性对数据进行分组。让它看起来很复杂的是你想在几个层面上做到这一点。

首先,您有3组数据"托运","运行","已销售"。解决它,你解决所有问题。

首先,您按车型分类。在模型中,您可以按年份分组。同样,它的核心是你想要通过某些属性对数据进行分组。

你可以使用这样的函数来做到这一点:

var cars = [
            { year: 2007, model: "Ford F-150" },
            { year: 2011, model: "Toyota Camry" },
            { year: 2007, model: "Ford F-150" },
            { year: 2007, model: "Ford F-150" },
            { year: 2005, model: "Dodge RAM" }
        ];

function groupBy(propertyName, array) {
    var groupedElements = {};

    for(var i = 0; i < array.length; i++) {
        var element = array[i];
        var value = element[propertyName];

        var group = groupedElements[value];
        if(group == undefined) {
            group = [element];
            groupedElements[value] = group;
        } else {
            group.push(element);
        }
    }

    return groupedElements;
}

var result = groupBy("year", cars)

输出将是:

{
    "2005": [
        {
            "year": 2005,
            "model": "Dodge RAM"
        }
    ],
    "2007": [
        {
            "year": 2007,
            "model": "Ford F-150"
        },
        {
            "year": 2007,
            "model": "Ford F-150"
        },
        {
            "year": 2007,
            "model": "Ford F-150"
        }
    ],
    "2011": [
        {
            "year": 2011,
            "model": "Toyota Camry"
        }
    ]
}

你可以在这个JSFiddle中使用它:http://jsfiddle.net/luisperezphd/jCt2k/

您可以在每个级别完成您想要执行此分组的操作。第一组逐年。然后逐个浏览每个生成组。您的计数将是值数组的length