删除重复错误,未定义数组 [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 => item.webservice))];
以上是关于删除重复错误,未定义数组 [x]的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 中的数组错误:未捕获的 TypeError:无法读取未定义的属性“x”