【问题标题】:How to remove duplicates from an array object property value?如何从数组对象属性值中删除重复项?
【发布时间】:2019-12-12 08:30:58
【问题描述】:

如何遍历对象属性并从作为该对象属性值的数组中删除重复项?

原始对象

var navObjects = {
    'Components': ['x', 'y', 'x'],
    'Document': ['z', 'z', 'z', 'q'],
    'Utilities': ['a', 'b', 'c']
}

想要的对象

navObjects: {
    'Components': ['x', 'y'],
    'Document': ['z','q'],
    'Utilities': ['a', 'b', 'c']
}

我尝试过的

for (let i = 0; i < Object.values(navObjects).length; i++) {

    let obj = Object.values(navObjects)[i];

    Object.values(obj).filter((item, index) => obj.indexOf(item) === index);
    console.log(obj);

}

运行此块后数组保持不变。

【问题讨论】:

    标签: javascript arrays filter duplicates


    【解决方案1】:

    您可以使用Set 构造函数和spread syntax

    const navObjects = {
      'Components': ['x', 'y', 'x'],
      'Document': ['z', 'z', 'z', 'q'],
      'Utilities': ['a', 'b', 'c']
    };
    
    for (const key in navObjects) {
      navObjects[key] = [...new Set(navObjects[key])];
    }
    
    console.log(navObjects);

    【讨论】:

    • 不错。这样就赢了。
    • 这只有在我们假设对象只有数组成员并且我们打算删除所有成员的重复项时才有效。
    【解决方案2】:

    此代码将帮助您实现目标。

    var newNavObjects = {}
    var existObjects = {}
    for(let key in navObjects) {
        let objects = navObjects[key];
        newNavObjects[key] = [];
        existObjects[key] = {};
        for(let object of objects) {
            if (!existObjects[key][object]) {
                existObjects[key][object] = 1;
                newNavObjects[key].push(object);
            }
        }
    }
    delete existObjects;
    console.log(newNavObjects);
    

    我为效率创建了新变量。如果我们使用 indexOf 来检查数组中的值是否存在。在这种情况下,它会比我们检查目标变量 key 更重。这仍然不是最好的解决方案,但这肯定会。 :)

    【讨论】:

      【解决方案3】:

      您可以创建Set 来删除重复项并获取values() 以便将其转换回数组,例如:

      (new Set(['z', 'z', 'z', 'q'])).values()
      

      让我们为它创建一个function

      function removeDuplicates(input) {
          return (new Set(input)).values();
      }
      

      然后使用它:

      var navObjects = {
          'Components': removeDuplicates(['x', 'y', 'x']),
          'Document': removeDuplicates(['z', 'z', 'z', 'q']),
          'Utilities': removeDuplicates(['a', 'b', 'c'])
      }
      

      【讨论】:

      • 我想知道这个答案被否决的原因。我对其进行了测试,并且有效。如果有人能说明原因,我将不胜感激。
      猜你喜欢
      • 2021-06-18
      • 2012-05-17
      • 2020-06-29
      • 1970-01-01
      • 2016-11-08
      • 2022-12-05
      • 1970-01-01
      • 2020-07-25
      • 2016-09-10
      相关资源
      最近更新 更多