【问题标题】:Check for duplicates in JSON检查 JSON 中的重复项
【发布时间】:2015-09-08 00:50:09
【问题描述】:

我有一个 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",
    }

并将其与对象进行比较。上面的记录将返回 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
               }
        }

【问题讨论】:

  • 你认为duplicate是什么?
  • 1) 这不是 JSON。 2) JavaScript 对象中不能有重复的键。您分配的最终结果是object1 中的每个对象都有一个value2 键。
  • 对不起,我写了不好的例子,我删除了键
  • 另外,这不是一个对象,它是一个数组。

标签: javascript jquery json duplicates


【解决方案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;
}
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

【讨论】:

  • 是的,效果很好。从我的角度来看,我必须清理“资产”对象以仅包含唯一值。然后,在新的唯一数组上使用 for 循环并将其应用于您的代码。谢谢!
【解决方案2】:

如果您正在寻找一个函数来计算一个对象在数组中出现的次数,那么下面的代码应该可以帮助您(假设您的对象中的属性将始终遵循相同的顺序。如果您不确定您是否应该使用适当的相等检查功能):

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

JSFiddle link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2020-08-25
    • 2017-08-02
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多