Javascript查找并计算重复键值

时间:2016-09-13 20:35:20

标签: javascript

我有一个JSON数组如下:

var testJSON = [
    { "AssetA": "asset_a", "AssetB": "asset_b" },
    { "AssetA": "asset_a", "AssetB": "asset_b" },
    { "AssetA": "asset_c", "AssetB": "asset_d" },
{ "AssetA": "asset_c", "AssetB": "asset_e" }];

我想做的是计算所有重复项。例如,我希望我的结果是另一个数组,其中行的前两个元素是重复值,第三个元素是它重复的次数,如下所示:

[{asset_a, asset_b,2},
{asset_c, asset_d,1},
{asset_c, asset_e,1}]

到目前为止,我能够识别重复项,但它一直挂断,我的视觉工作室崩溃了:

for (var i = 0; i < testJSON.length; i++) {
    for (var j = i + 1; j < testJSON.length;) {
        if (testJSON[i][0] == testJSON[j][0] && testJSON[i][1] == testJSON[j][1])
            // Found the same. Remove it.
            console.log("they are equal");

        else
            // No match. Go ahead.
            j++;
    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用对象进行收集,并使用数组作为结果集

这两个属性都用作键,用于在数组中查找。如果未找到,则使用所需值构建新数组并将其插入结果集中。然后计数增加了。

var testJSON = [{ "AssetA": "asset_a", "AssetB": "asset_b" }, { "AssetA": "asset_a", "AssetB": "asset_b" }, { "AssetA": "asset_c", "AssetB": "asset_d" }, { "AssetA": "asset_c", "AssetB": "asset_e" }],
    result = [];

testJSON.forEach(function (a) {
    var k = a.AssetA + '|' + a.AssetB;
    if (!this[k]) {
        this[k] = [a.AssetA, a.AssetB, 0];
        result.push(this[k]);
    }
    this[k][2]++;
}, Object.create(null));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

  1. testJSON[i][0]
  2. 我不相信这会像那样起作用。你拥有的是一个物体阵列。

    因此,testJSON[i]将返回OBJECT,而不是ARRAY,因此testJSON[i][0]不应返回任何有价值的内容。你想要的是testJSON[i]['AssetA']

    1. 挂断
    2. 另一件事是当if (testJSON[i][0] == testJSON[j][0] && testJSON[i][1] == testJSON[j][1])在j = i + 1时成功。在这种情况下,您将继续迭代j的相同值。您需要将j ++添加到您的forloop并删除else子句,否则将其处理以获得所需的效果。

      例如

      for (var i = 0; i < testJSON.length; i++) {
          for (var j = i + 1; j < testJSON.length; j++) {
              if (testJSON[i]["AssetA"] == testJSON[j]["AssetA"] && 
                  testJSON[i]["AssetB"] == testJSON[j]["AssetB"])
                  console.log("they are equal");
          }
      }