代码之家  ›  专栏  ›  技术社区  ›  esseara

使用javascript中的set删除重复项

  •  5
  • esseara  · 技术社区  · 6 年前

    我正在努力做一些应该很简单的事情。我有一组对象。我需要根据 id 财产。所以我想创建一个 Set 包含我的ID,如下所示:

    let myArray = [{
        id: 10,
        other: "bla"
      },
      {
        id: 15,
        other: "meh"
      },
      {
        id: 10,
        other: "bla"
      }
    ]
    
    let indexes = new Set();
    myArray.forEach(a => indexes.add(a.id));
    console.log('indexes list', indexes)

    但是 indexes 总是空的。我做错什么了?谢谢。

    编辑:我选择@hyyan abo fakher的回答是正确的,因为他是正确的,但是@bambam comment中的建议是解决整个问题的一个很好的方法。谢谢大家。

    4 回复  |  直到 6 年前
        1
  •  1
  •   Hyyan Abo Fakher JM1    6 年前

    但索引始终为空。我做错什么了?

    您的代码是完全正常的,问题似乎来自浏览器控制台本身,您希望将 set 打印到控制台将把集合中的项目打印为数组,但实际上,浏览器将只打印对象实例。

    在stackoverflow上运行代码将打印 indexes list code>,但实际上,浏览器控制台打印了其他内容。

    要确保列表不为空,请使用

    let myarray=[{
    身份证:10,
    其他:“BLA”
    }
    {
    身份证:15,
    其他:“MEH”
    }
    {
    身份证:10,
    其他:“BLA”
    }
    ]
    
    让indexes=new set();
    myarray.foreach(a=>indexes.add(a.id));
    console.log('indexes list',indexes.size)>
    

    要循环访问集合,需要使用 for…

    let myarray=[{
    身份证:10,
    其他:“BLA”
    }
    {
    身份证:15,
    其他:“MEH”
    }
    {
    身份证:10,
    其他:“BLA”
    }
    ]
    
    让indexes=new set();
    myarray.foreach(a=>indexes.add(a.id));
    for(let item of indexes)console.log(item);>
    
    r控制台本身,您希望打印 set 到控制台将以数组的形式打印集合的项,但实际上,浏览器将只打印对象实例。

    在stackoverflow上运行代码将打印 indexes list {} 但事实上,浏览器控制台还打印了其他内容。

    enter image description here

    要确保列表不为空,请使用 size 财产

    let myArray = [{
        id: 10,
        other: "bla"
      },
      {
        id: 15,
        other: "meh"
      },
      {
        id: 10,
        other: "bla"
      }
    ]
    
    let indexes = new Set();
    myArray.forEach(a => indexes.add(a.id));
    console.log('indexes list', indexes.size)

    在需要使用的集合上循环 for ... of

    let myArray = [{
        id: 10,
        other: "bla"
      },
      {
        id: 15,
        other: "meh"
      },
      {
        id: 10,
        other: "bla"
      }
    ]
    
    let indexes = new Set();
    myArray.forEach(a => indexes.add(a.id));
    for (let item of indexes) console.log(item);
        2
  •  5
  •   Nenad Vracar    6 年前

    你可以使用 filter 方法与 Set 创建唯一对象的新数组的步骤 id .

    const data = [{id: 10, other: "bla"},{id: 15, other: "meh"},{id: 10, other: "bla"}]
    
    let result = data.filter(function({id}) {
      return !this.has(id) && this.add(id);
    }, new Set)
    
    console.log(result)
        3
  •  1
  •   31piy    6 年前

    您可以检查集合是否具有ID,如果没有,则将元素推送到新数组。最后一个数组将具有唯一的元素。

    var source = [
      {id: 10, other: "bla"},
      {id: 15, other: "meh"},
      {id: 10, other: "bla"}
    ];
    
    var set = new Set();
    var result = [];
    
    source.forEach(item => {
      if (!set.has(item.id)) {
        set.add(item.id);
        result.push(item);
      }
    })
    
    console.log(result);
        4
  •  1
  •   Reinstate Monica Cellio James L.    6 年前

    简单地说,我们可以使用数组在循环的帮助下解决这个问题。如下所示:

    var b = [];
    a.forEach(function(index){
       if(b[index.id]==undefined){
           b[index.id] = index.other;
       }
    });
    console.log(b);
    

    这里是原始源数组。