【问题标题】:javascript remove duplicates doesn't workjavascript删除重复项不起作用
【发布时间】:2020-03-18 20:33:22
【问题描述】:

我想编写代码,遍历数组并删除重复项。副本在所有对象属性中应具有相同的值。

我的数组如下所示:

[ { name: 'Romeo Minnock', semester: 12 },
  { name: 'Romeo Minnock', semester: 8 },
  { name: 'Gideon Heinemann', semester: 19 },
  { name: 'Gideon Heinemann', semester: 1 },
  { name: 'Gideon Heinemann', semester: 19 },
  { name: 'Gideon Heinemann', semester: 12 },
  { name: 'Brant Colegrove', semester: 3 },
  { name: 'Brant Colegrove', semester: 17 },
  { name: 'Gideon Heinemann', semester: 1 },
  { name: 'Gideon Heinemann', semester: 12 } ]

现在我想删除姓名和学期具有相同值的学生。 但是我的代码只输出一个像这样的空数组:[] 我的 if 条件有问题吗?

for( k = 0; k < sameNameStudent.length; k++){
    for( l = k + 1; l < sameNameStudent.length; l++){
        if(sameNameStudent[k].semester == sameNameStudent[l].semester){
            sameNameStudent.splice(sameNameStudent[l])
        }
    }
}    

console.log(sameNameStudent);

【问题讨论】:

  • 我很好奇——即使从数组中删除重复元素是合法的做法——你的数组是从哪里来的,它包含重复的值?或许您的数据查询并非真正应有的样子?
  • 这个问题的另一种解决方案stackoverflow.com/questions/50729508/…

标签: javascript arrays object


【解决方案1】:

我会为此使用 reduce 函数:

const students = [ 
  { name: 'Romeo Minnock', semester: 12 },
  { name: 'Romeo Minnock', semester: 8 },
  { name: 'Gideon Heinemann', semester: 19 },
  { name: 'Gideon Heinemann', semester: 1 },
  { name: 'Gideon Heinemann', semester: 19 },
  { name: 'Gideon Heinemann', semester: 12 },
  { name: 'Brant Colegrove', semester: 3 },
  { name: 'Brant Colegrove', semester: 17 },
  { name: 'Gideon Heinemann', semester: 1 },
  { name: 'Gideon Heinemann', semester: 12 } 
]

students.reduce((list, current) => {
    // Check that the list does not contain this current value
    // if not push it to the array
    if (!list.find(s => s.name === current.name && s.semester === current.semester)) {
      list.push(current);
    }

    return list;
}, []);

【讨论】:

    【解决方案2】:

    这是一个基于此的工作解决方案:https://stackoverflow.com/a/20339709/7919626

    var sameNameStudent = [{
        name: 'Romeo Minnock',
        semester: 12
      },
    
      {
        name: 'Romeo Minnock',
        semester: 8
      },
    
      {
        name: 'Gideon Heinemann',
        semester: 19
      },
    
      {
        name: 'Gideon Heinemann',
        semester: 1
      },
    
      {
        name: 'Gideon Heinemann',
        semester: 19
      },
    
      {
        name: 'Gideon Heinemann',
        semester: 12
      },
    
      {
        name: 'Brant Colegrove',
        semester: 3
      },
    
      {
        name: 'Brant Colegrove',
        semester: 17
      },
    
      {
        name: 'Gideon Heinemann',
        semester: 1
      },
    
      {
        name: 'Gideon Heinemann',
        semester: 12
      }
    ];
    
    function multiDimensionalUnique(arr) {
        var uniques = [];
        var itemsFound = {};
        for(var i = 0, l = arr.length; i < l; i++) {
            var stringified = JSON.stringify(arr[i]);
            if(itemsFound[stringified]) { continue; }
            uniques.push(arr[i]);
            itemsFound[stringified] = true;
        }
        return uniques;
    }
    
    console.log(multiDimensionalUnique(sameNameStudent));

    【讨论】:

      【解决方案3】:

      创建一个没有重复的数组比在循环数组时删除重复的数组更容易。

      将数组简化为 Map,使用由对象值构建的键,将 Map.values() 迭代器传播回数组:

      const data = [{"name":"Romeo Minnock","semester":12},{"name":"Romeo Minnock","semester":8},{"name":"Gideon Heinemann","semester":19},{"name":"Gideon Heinemann","semester":1},{"name":"Gideon Heinemann","semester":19},{"name":"Gideon Heinemann","semester":12},{"name":"Brant Colegrove","semester":3},{"name":"Brant Colegrove","semester":17},{"name":"Gideon Heinemann","semester":1},{"name":"Gideon Heinemann","semester":12}]
      
      const result = [...
        data.reduce((m, o) => {
          const key = Object.values(o).join('--') // another option is JSON.stringify(o) if the object can have nested object values
          
          return m.has(key) ? m : m.set(key, o)
        }, new Map())
      .values()]
      
      console.log(result)

      【讨论】:

        【解决方案4】:

        您的算法不起作用的原因是因为您显然没有足够仔细地研究splice 的工作原理。

        您不会像您所做的那样将数组元素传递给splice——您至少将它传递给将开始删除(和/或添加)的第一个(最左边,最早)元素的索引,并且,可选地,要删除的元素数量(或者它将删除从您作为第一个参数传递的索引开始的所有元素)。然后,所有后续参数都将被视为您要添加的元素,从删除元素的位置开始。

        由于您显然想要删除单个元素 - 如果您要消除重复项,就像您尝试使用您的算法一样,您会这样做 - 您的情况下的正确表达式必须是 someNameStudent.splice(l, 1) .

        您的比较谓词(用于确定元素之间相等性的标准)也可能不够充分,即使 splice 的错误已得到纠正——您只比较 semester 属性的值——没有您是否暗示元素仅在 both 名称 学期相等时才重复?如果是这种情况,您需要在 if 语句中使用 sameNameStudent[k].name == sameNameStudent[l].name &amp;&amp; sameNameStudent[k].semester == sameNameStudent[l].semester 作为表达式。

        【讨论】:

          猜你喜欢
          • 2019-09-13
          • 2020-08-20
          • 2015-12-21
          • 1970-01-01
          • 1970-01-01
          • 2017-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多