检查 JSON 中的重复项
Check for duplicates in JSON
我有一个 json 对象:
var object1 = [{
"value1": "1",
"value2": "2",
"value3": "3",
},
{
"value1": "1",
"value2": "5",
"value3": "7",
},
{
"value1": "6",
"value2": "9",
"value3": "5",
},
{
"value1": "6",
"value2": "9",
"value3": "5",
}]
现在我想从该对象中取出每条记录,并检查该记录的精确副本在该对象中出现了多少次。如果只有 1 个副本,则执行某些操作;如果超过 2 个,则执行其他操作。
关于 JSON 重复项的答案很少,但它们针对的是特定值而不是完整记录。
那我记录一下:
{
"value1": "1",
"value2": "2",
"value3": "3",
}
并将其与对象进行比较。上面的记录将 return 1 因为对象内部只有 1 个副本
供将来使用。完整的答案是:
var asset = [
{ value1: "1", value2: "2", value3: "3" },
{ value1: "1", value2: "5", value3: "7" },
{ value1: "6", value2: "9", value3: "5" },
{ value1: "6", value2: "9", value3: "5" }
];
function countEqual(oo, pp) {
var count = 0;
oo.forEach(function (el) {
var i, equal = true;
for (i in el) {
equal = equal && el[i] === pp[i];
}
equal && count++;
});
return count;
}
var cleaned = [];
asset.forEach(function (itm) {
var unique = true;
cleaned.forEach(function (itm2) {
if (_.isEqual(itm, itm2)) unique = false;
});
if (unique) cleaned.push(itm);
});
for (var i = 0; i < cleaned.length; i++)
{
if(countEqual(asset, cleaned[i]) === 1)
{
// DO SOMETHING
}
else
{
// DO SOMETHING ELSE
}
}
如果您要查找的是一个计算数组中某个对象出现次数的函数,则以下代码应该对您有所帮助(这假设您的对象中的属性始终遵循相同的顺序。如果您不确定,您应该使用适当的相等性检查功能):
var nbOcc = function (needle, haystack) {
return haystack.filter(function (record) {
return JSON.stringify(needle) === JSON.stringify(record);
}).length;
};
console.log(nbOcc({
"value1": "1",
"value2": "2",
"value3": "3",
}, object1)); // 1
console.log(nbOcc({
"value1": "6",
"value2": "9",
"value3": "5",
}, object1)); // 2
var asset = [
{ value1: "1", value2: "2", value3: "3" },
{ value1: "1", value2: "5", value3: "7" },
{ value1: "6", value2: "9", value3: "5" },
{ value1: "6", value2: "9", value3: "5" }
];
function countEqual(oo, pp) {
var count = 0;
oo.forEach(function (el) {
var i, equal = true;
for (i in el) {
equal = equal && el[i] === pp[i];
}
equal && count++;
});
return count;
}
console.log(countEqual(asset, { value1: "1", value2: "1", value3: "2" })); // 0
console.log(countEqual(asset, { value1: "1", value2: "2", value3: "3" })); // 1
console.log(countEqual(asset, { value1: "6", value2: "9", value3: "5" })); // 2
我有一个 json 对象:
var object1 = [{
"value1": "1",
"value2": "2",
"value3": "3",
},
{
"value1": "1",
"value2": "5",
"value3": "7",
},
{
"value1": "6",
"value2": "9",
"value3": "5",
},
{
"value1": "6",
"value2": "9",
"value3": "5",
}]
现在我想从该对象中取出每条记录,并检查该记录的精确副本在该对象中出现了多少次。如果只有 1 个副本,则执行某些操作;如果超过 2 个,则执行其他操作。
关于 JSON 重复项的答案很少,但它们针对的是特定值而不是完整记录。
那我记录一下:
{
"value1": "1",
"value2": "2",
"value3": "3",
}
并将其与对象进行比较。上面的记录将 return 1 因为对象内部只有 1 个副本
供将来使用。完整的答案是:
var asset = [
{ value1: "1", value2: "2", value3: "3" },
{ value1: "1", value2: "5", value3: "7" },
{ value1: "6", value2: "9", value3: "5" },
{ value1: "6", value2: "9", value3: "5" }
];
function countEqual(oo, pp) {
var count = 0;
oo.forEach(function (el) {
var i, equal = true;
for (i in el) {
equal = equal && el[i] === pp[i];
}
equal && count++;
});
return count;
}
var cleaned = [];
asset.forEach(function (itm) {
var unique = true;
cleaned.forEach(function (itm2) {
if (_.isEqual(itm, itm2)) unique = false;
});
if (unique) cleaned.push(itm);
});
for (var i = 0; i < cleaned.length; i++)
{
if(countEqual(asset, cleaned[i]) === 1)
{
// DO SOMETHING
}
else
{
// DO SOMETHING ELSE
}
}
如果您要查找的是一个计算数组中某个对象出现次数的函数,则以下代码应该对您有所帮助(这假设您的对象中的属性始终遵循相同的顺序。如果您不确定,您应该使用适当的相等性检查功能):
var nbOcc = function (needle, haystack) {
return haystack.filter(function (record) {
return JSON.stringify(needle) === JSON.stringify(record);
}).length;
};
console.log(nbOcc({
"value1": "1",
"value2": "2",
"value3": "3",
}, object1)); // 1
console.log(nbOcc({
"value1": "6",
"value2": "9",
"value3": "5",
}, object1)); // 2
var asset = [
{ value1: "1", value2: "2", value3: "3" },
{ value1: "1", value2: "5", value3: "7" },
{ value1: "6", value2: "9", value3: "5" },
{ value1: "6", value2: "9", value3: "5" }
];
function countEqual(oo, pp) {
var count = 0;
oo.forEach(function (el) {
var i, equal = true;
for (i in el) {
equal = equal && el[i] === pp[i];
}
equal && count++;
});
return count;
}
console.log(countEqual(asset, { value1: "1", value2: "1", value3: "2" })); // 0
console.log(countEqual(asset, { value1: "1", value2: "2", value3: "3" })); // 1
console.log(countEqual(asset, { value1: "6", value2: "9", value3: "5" })); // 2