我有一个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++;
}
}
答案 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)
testJSON[i][0]
我不相信这会像那样起作用。你拥有的是一个物体阵列。
因此,testJSON[i]
将返回OBJECT,而不是ARRAY,因此testJSON[i][0]
不应返回任何有价值的内容。你想要的是testJSON[i]['AssetA']
另一件事是当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");
}
}