【问题标题】:Counting duplicate objects in array of Javascript objects计算 Javascript 对象数组中的重复对象
【发布时间】:2014-02-24 15:56:35
【问题描述】:

我正在尝试解析 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. 已售出(同上)

年份的顺序应基于该年份的模型总数(最高 # 在前)。同样,年份下的模型的顺序应该按最高计数排序。

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

  1. 已寄售(已寄售的数量)

    • Model1(该模型所有年份的总数)
      • 第 1 年(今年的模型计数)
      • 第 2 年(今年的模型计数)
    • Model2(该模型所有年份的总数)
  2. 运行(运行次数)

    • Model1(该模型所有年份的总数)
      • 第 1 年(今年的模型计数)
      • 第 2 年(今年的模型计数)
    • Model2(该模型所有年份的总数)
  3. 已售出(同上)

这个排序也将基于计数。如果您需要任何澄清,请告诉我!谢谢!

【问题讨论】:

  • 查询“that's not json” 5, 4, 3 的脚本 Kiddie avalanche
  • @WillWeld 这不是 json。 JSON 是一种表示法。你所拥有的是一个 JavaScript 对象。
  • @ExplosionPills 哎呀...更改了标题 - 更好?编辑:我对语义很糟糕。 objToReturn 是 Javascript 对象的 JSON 数组吗?还是它是一个带有子对象的 Javascript 对象?
  • @WillWeld - 这是一个对象数组。

标签: javascript jquery json multidimensional-array


【解决方案1】:

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

首先,您有 3 组数据“Consigned”、“Run”、“Sold”。为一个人解决它,你为所有人解决它。

首先,您将汽车按型号分组。在模型中,您可以按年份对汽车进行分组。不过,它的核心仍然是您希望按某些属性对数据进行分组。

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

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/

您可以在每个级别完成您想要做的分组。每年第一组。然后逐年遍历每个生成组和组。您的计数将是 values 数组的 length。

【讨论】:

  • 这太棒了!非常感谢!
  • 你做到了朋友(y)
猜你喜欢
  • 2013-06-03
  • 1970-01-01
  • 2018-09-15
  • 2021-01-02
  • 1970-01-01
  • 2017-12-28
  • 2021-07-06
  • 2012-05-19
  • 2018-09-22
相关资源
最近更新 更多