【问题标题】:Remove Duplicate Object from JSON Array从 JSON 数组中删除重复对象
【发布时间】:2020-06-23 02:05:07
【问题描述】:

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

【问题讨论】:

标签: javascript arrays json servicenow


【解决方案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 如果是这样,只需将箭头功能更改为正常功能:function(x) {return x.name === splitlen[i].name;}
  • 谢谢,仍然没有运气。您能否在此处提供代码。我将不胜感激。
  • @snowcoder 我刚刚更新了我的答案,第二个解决方案不使用箭头函数
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    请尝试以下示例

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我正在努力寻找答案,这是我的想法:

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

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

        希望对你有帮助!

        【讨论】:

          猜你喜欢
          • 2018-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-11
          • 2021-05-12
          • 1970-01-01
          • 2017-04-10
          • 1970-01-01
          相关资源
          最近更新 更多