从JSON数组中删除重复对象

3

我正试图从ServiceNow中的数组中删除重复的JSON对象。 尝试了以下代码,但它并没有删除重复项。我想要比较名称和城市两者。

var arr1 = '[{"name":"Pune","city":"India"},{"name":"Pune","city":"India"}]';
var splitlen = JSON.parse(arr1);
alert(splitlen.length);

var uniqueArray = [];
var uniqueJson = {};
for(i=0;i<splitlen.length;i++)
    {
        
        if(uniqueArray.indexOf(splitlen[i].name)==-1)
            {
                uniqueArray.push(splitlen[i]);
            }
    }

alert(JSON.stringify(uniqueArray));

预期输出:

[{"name":"Pune","city":"India"}]

2
这里有很多关于此问题的答案:https://dev59.com/U3E95IYBdhLWcg3wp_kg - Maniraj Murugan
5个回答

1

uniqueArray.indexOf 不起作用,因为你正在将对象与字符串 (splitlen[i].name) 进行比较。尝试使用 .find() 替代:

var arr1 = '[{"name":"Pune","city":"India"},{"name":"Pune","city":"India"}]';
var splitlen = JSON.parse(arr1);

var uniqueArray = [];
var uniqueJson = {};
for(i=0;i<splitlen.length;i++)
    {
        
        if(!uniqueArray.find(x => x.name === splitlen[i].name))
            {
                uniqueArray.push(splitlen[i]);
            }
    }

console.log(uniqueArray);

或者

var arr1 = '[{"name":"Pune","city":"India"},{"name":"Pune","city":"India"}]';
var splitlen = JSON.parse(arr1);

function compare(x){
   return x.name === splitlen[i].name;
}

var uniqueArray = [];
var uniqueJson = {};
for(i=0;i<splitlen.length;i++)
    {
        
        if(!uniqueArray.find(compare))
            {
                uniqueArray.push(splitlen[i]);
            }
    }

console.log(uniqueArray);


感谢@mickl的快速回复。我正在尝试在ServiceNow中删除重复项,但它不支持.find(x =>)函数和运算符。 - snowcoder
@snowcoder 如果是这样,只需将箭头函数更改为普通函数:function(x) {return x.name === splitlen[i].name;} - Yonggoo Noh
谢谢,还是没有运气。你能否在这里提供代码?我会非常感激你的帮助。 - snowcoder
@snowcoder,我刚刚更新了我的答案,第二个解决方案没有使用箭头函数。 - mickl

0
请尝试以下示例。

const arr1 = '[{"name":"Pune","city":"India"},{"name":"Pune","city":"India"}]';
const splitlen = JSON.parse(arr1);

const output = splitlen.reduce((previousValue, currentValue) => {
  const { name, city } = currentValue;
  const index = previousValue.findIndex(
    (entry) => entry.name === name && entry.city === city
  );

  if (index === -1) {
    return [...previousValue, currentValue];
  }

  return previousValue;
}, []);

console.log(output);

请查看


0
将记录放入哈希集中。如果哈希集中发生冲突,则存在重复项。这种方法的时间复杂度为O(n),而比较所有对的时间复杂度为$O(n^2)$。

0

你可以尝试这个。还有一件事,你的数组声明不正确,需要从数组中删除单引号。

    var arr1 = [{"name":"Pune","city":"India"},{"name":"Pune","city":"India"}];


    function getUniqueListByKey(arr, key) {
         return [...new Map(arr.map(item => [item[key], item])).values()]
     }

     var arr2 = getUniqueListByKey(arr1, "name")
     console.log(arr2);

0
我正在尝试寻找答案,这是我的想法:
创建一个函数来比较两个对象,然后创建一个函数来获取独特的值。
    function isEquals(obj1, obj2) {
    
        const aProps = Object.getOwnPropertyNames(obj1);
        const bProps = Object.getOwnPropertyNames(obj2);
        if (aProps.length !== bProps.length) {
            return false;
        }
    
        for (let j = 0; j < aProps.length; j++) {
            const propName = aProps[j];
            if (JSON.stringify(obj1[propName]) !== JSON.stringify(obj2[propName])) {
                return false;
            }
        } return true;
    
    }
  function getUnique(arr) {
            var uniqueArray = [];
            for (var item of arr) {
                const uniqueItems = arr.filter(i => isEquals(item, i));
                if (uniqueItems.length !== 0) {
                    uniqueArray.push(Object.assign({}, uniqueItems.shift()));
                }
                arr = arr.filter(i => !isEquals(item, i));
            }
            return uniqueArray;
        } 

希望能对你有所帮助!


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