从 JSON 数组中删除重复对象

Remove Duplicate Object from JSON Array

我正在尝试从 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"}]

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);

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

    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);

请尝试以下示例

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);

将记录放入哈希集中。如果哈希集中存在冲突,则存在重复。这种方法是 O(n) 而比较所有对是 $O(n^2)$.

我正在尝试得到答案,这是我的想法:

创建一个函数来比较两个对象,然后创建一个函数来获取唯一值

    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;
        } 

希望对您有所帮助!