按照每个JSON对象中的一个值,从JSON数组中删除重复项

4

如果在一个数组中有两个具有相同特定字段值的JSON对象,那么我想将它们标记为重复项。我想要删除其中一个。同样地,如果有多个重复项,我只想保留最后一个对象(即最新的)。如果输入如下:

names_array = [
    {name: "a",  age: 15},
    {name: "a",  age: 16},
    {name: "a",  age: 17},
    {name: "b",  age: 18}
    {name: "b",  age: 19}];

我希望输出结果为。
names_array_new = 
    {name: "a",  age: 17},
    {name: "b",  age: 19}];

我搜索了一下,但只找到如何在整个对象相同时删除重复项的方法。


1
请查看此链接:如何从JSON数组中删除重复对象?可能会有所帮助。 - Umair M
谢谢。这也很有帮助。 - SS306
4个回答

5
这应该就可以了:
names_array = [
    {name: "a",  age: 15},
    {name: "a",  age: 16},
    {name: "a",  age: 17},
    {name: "b",  age: 18},
    {name: "b",  age: 19}];

function hash(o){
    return o.name;
}    

var hashesFound = {};

names_array.forEach(function(o){
    hashesFound[hash(o)] = o;
})

var results = Object.keys(hashesFound).map(function(k){
    return hashesFound[k];
})

hash 函数确定哪些对象是重复的,hashesFound 对象存储每个哈希值以及产生该哈希值的最新对象,results 数组包含匹配的对象。


1
一个稍微不同的方法:

var names_array = [
    { name: "a", age: 15 },
    { name: "a", age: 16 },
    { name: "a", age: 17 },
    { name: "b", age: 18 },
    { name: "b", age: 19 }
];

var names_array_new = names_array.reduceRight(function (r, a) {
    r.some(function (b) { return a.name === b.name; }) || r.push(a);
    return r;
}, []);

document.getElementById('out').innerHTML = JSON.stringify(names_array_new, 0, 4);
<pre id="out"></pre>


0

Array.from(new Set(brand.map(obj => JSON.stringify(obj)))).map(item => JSON.parse(item))

将品牌数组中的对象转换为字符串,使用Set去重后再转换回对象。


1
虽然这段代码片段可能是解决方案,但包括解释真的有助于提高您帖子的质量。请记住,您正在为未来的读者回答问题,而那些人可能不知道您提出代码建议的原因。 - Narendra Jadhav

0
var names_array = [
{name: "a", age: 15},
{name: "a", age: 16},
{name: "a", age: 17},
{name: "b", age: 18},
{name: "b", age: 19}];

function removeDuplicate(arr, prop) {
var new_arr = [];
var lookup = {};
for (var i in arr) {
    lookup[arr[i][prop]] = arr[i];
}
for (i in lookup) {
    new_arr.push(lookup[i]);
}
return new_arr;}
var newArray = removeDuplicate(names_array, 'name');
console.log("Result "+newArray);

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