消除JSON对象中的重复项。

13
[
  {
    "lastName": "Seymour",
    "gender": "Female",
    "patientID": 18134,
    "firstName": "Stephanie",
    "age": "111Y"
  },
  {
    "lastName": "Seymour",
    "gender": "Female",
    "patientID": 18134,
    "firstName": "Stephanie",
    "age": "111Y"
  }
]

如何在添加之前检查我的 JSON 是否包含此值...


3
好问题,我想知道除了比较所有的值之外还有没有其他方法。 +1 - Ruslan
2个回答

14

显然的方式

最显而易见的方式是使用for循环遍历所有数组项,并在每次需要知道是否已经有特定项时进行比较。这种方法很琐碎但也很繁琐,特别是当你需要进行许多比较时。

function contains(items, obj) {
    var itemKey = null;
    var objKey = obj.firstName + ";" + obj.lastName;
    var result = false;
    for(var i = 0; !result && i < arr.length; i++)
    {
        itemKey = items[i].firstName + ";" + items[i].lastName;
        result = itemKey === objKey;
    }
    return result;
};

每当你要搜索现有对象:

contains(arr, newObj);

更聪明的方式

这段代码利用了Javascript原型的能力,可以将其作为一种类似于关联内存存储的数组使用。假设您的JSON数据项存储在变量arr中。定义比较键(例如,名字和姓氏):

var arr = /* your JSON object */;
var hash = (function() {
    var keys = {};
    return {
        contains: function(key) {
            return keys[key] === true;
        },
        add: function(key) {
            if (keys[key] !== true)
            {
                keys[key] = true;
            }
        }
    };
})();

var key = null;
for (var i = 0; i < arr.length; i++)
{
    key = arr[i].firstName + ";" + arr[i].lastName;
    if (!hash.contains(key))
    {
        hash.add(key);
    }
}
找出你的数组中是否已经有一个项目,那么非常简单:
hash.contains(key);

就这样了。比整个数组迭代要快得多。尤其是当它有很多项时。


Koritnik:谢谢您的答复,能否给我展示一下另一种在数组中迭代的方法...因为我的数组只有5-10个项目。 - John Cooper
Kortnik:你能看出这个jsfiddle有什么问题吗?http://jsfiddle.net/spechackers/eMbmw/ - John Cooper
2
@John:没事了。我调试过了,它按预期工作。当它到达数组中的第一个对象时,它会存储其键,当它到达第二个对象时,它不会存储,因为已经存在。你可能希望它从原始数组中删除对象...好的。让我为你更改一下...在这里 - Robert Koritnik
如果相同的问题中名字相同,我想要将两个数组中的年龄相加。我们应该如何做到这一点? - shiva

0

什么是“包含此值”?你的意思是,这两个项目所有字段都相等吗?

在这种情况下,您可以将每个项目序列化为字符串(JSON),并将新项目(也进行序列化)与现有集合进行比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接