删除重复错误,未定义数组 [x]

Posted

技术标签:

【中文标题】删除重复错误,未定义数组 [x]【英文标题】:removing duplicates error, array[x] is not defined 【发布时间】: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 函数是一个很好的解决方案。 【参考方案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))];

以上是关于删除重复错误,未定义数组 [x]的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 中的数组错误:未捕获的 TypeError:无法读取未定义的属性“x”

错误:未捕获 [TypeError:无法读取未定义 Jest 反应测试的属性“x”

即使将元素推入其中,数组元素也未定义[重复]

在对象与数组中解构未定义[重复]

循环遍历 JSON 数组会给出“未定义”的结果 [重复]

从数组中删除未定义的值