【问题标题】:removing duplicates error, array[x] is not defined删除重复错误,未定义数组 [x]
【发布时间】:2020-04-12 08:48:46
【问题描述】:

我正在尝试从节点传递的数据中删除重复项。获取数据的函数是:

getProducts(_) {
     const dev = "http://localhost:3008/api"
      fetch(dev) 
      .then(res => res.json())
      .then(data => {
       /* this.setState
        ({
          data: data.data
        })
      })*/
     this.removeDuplicates(data) 
      })
    }

我的删除重复功能是:

removeDuplicates(arr){ 
    let array = arr.data
  console.log(array)
    array.sort((a,b) => {return a.webservice - b.webservice}) 
  let length = array.length 
   for ( var i = 0; 
          i < length; 
          i++ ){
            let x = i+1
           console.log(array[x].webservice)
    /*  if (array[i].webservice == array[x].webservice){
        delete array[i]
      }*/
     // console.log(array)
      }
  }

当我 console.log 时 data - 它按预期返回对象数组。 当我 console.log array[i].webservice - 它返回网络服务 但是当我尝试对array[x].webservice(即 i+1)执行相同操作时,它返回 array[x] 是未定义的致命错误,但仍然 console.logs 数据。

我在这里遗漏了什么吗?

【问题讨论】:

  • 我建议使用lodash。它具有您正在寻找的过滤功能。
  • 能否展示data的一些示例内容
  • 一个经验法则是永远不要改变正在循环的数组或更改索引。你在这里做这两件事。减少功能会更好地过滤掉唯一性。 @user615274 提供的array.reduce 函数是一个很好的解决方案。

标签: javascript arrays node.js reactjs javascript-objects


【解决方案1】:

仔细看看这部分代码:

for (var i = 0; i < length; i++ ){
  let x = i+1;
  // ...etc....
}

假设数组的长度为3,当i = 2时,小于3,所以会执行循环; x = i + 1 = 2 + 1 = 3。然后你试图访问array[3]——但是长度为3的数组只从0到2!这将尝试访问超出数组的范围,因此会出现错误。

【讨论】:

    【解决方案2】:

    您可以按如下方式从数组中删除重复项,

    假设您的数据与此类似

    const data = [
      { webservice: "a" },
      { webservice: "b" },
      { webservice: "c" },
      { webservice: "b" },
      { webservice: "d" },
    ];
    

    在此示例中,带有值为 b 且索引为 3 的 webservice 的项目将被排除以进行重复

    const data = [
      { webservice: "a" },
      { webservice: "b" },
      { webservice: "c" },
      { webservice: "b" },
      { webservice: "d" },
    ];
    
    const output = data.reduce((accumulator, current) => {
      if (!accumulator.some(element => element.webservice === current.webservice)) {
        accumulator.push(current);
      }
    
      return accumulator;
    }, []);
    
    console.log(output);

    希望我已经正确解释了您的问题

    【讨论】:

    • 你也可以把它简化为一个以webservice为key,data为value,最后返回object.values的对象。节省大量循环
    • 如果你使用的是 ES6/ES2015 或更高版本,你可以这样做:const unique = [...new Set(data.map(item =&gt; item.webservice))];
    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 2020-05-15
    • 2018-07-30
    • 1970-01-01
    • 2018-07-18
    • 2020-04-20
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多