【问题标题】:Looping through array and removing elements of specific types d3.js循环遍历数组并删除特定类型的元素 d3.js
【发布时间】:2016-03-11 16:10:43
【问题描述】:

data 是一个包含不同类型元素的数组。我想遍历这个数组并删除所有类型为A 和类型B 的元素。这是我目前所拥有的:

for(i=0;i<data.length;i++){ 
    if (i.type === "A"|| i.type === "B") {
        data.splice(i, 1);
    }   
}

即使有些是AB 类型,它也不会删除任何内容。

谁能告诉我为什么会出现这种错误以及我应该如何解决它!

提前致谢!

【问题讨论】:

标签: javascript arrays loops d3.js


【解决方案1】:

问题

您的代码中实际上有两个错误:

  1. 您正在向前循环。如果要在遍历数组元素的同时拼接数组,则需要向后循环。
  2. i.type 应该是 data[i].typei 只是一个数字,甚至没有 type 属性。

固定代码

for(var i = data.length-1; i >= 0; i--){ 
    if (data[i].type === "A"|| data[i].type === "B") {
        data.splice(i, 1);
    }   
}

演示

var data = [
    { value : 'Tom', type : 'A' },
    { value : 'Susan', type : 'C' },
    { value : 'Frank', type : 'B' },
    { value : 'Hakeem', type : 'A' },
    { value : 'Ali', type : 'C' },
    { value : 'Thomas', type : 'B' },
    { value : 'An', type : 'D' }
];

for(var i = data.length-1; i >= 0; i--){ 
    if (data[i].type === "A"|| data[i].type === "B") {
        data.splice(i, 1);
    }   
}

document.body.innerHTML = JSON.stringify(data);

(另见this Fiddle


注意

如果您实际上将获得更好的性能 - 而不是使用 data[i].type === "A"|| data[i].type === "B" 删除所有对象 - 您只需创建一个新数组并复制原始数组数组中的所有值 data[i].type !== "A" &amp;&amp; data[i].type !== "B"

var data = [
    { value : 'Tom', type : 'A' },
    { value : 'Susan', type : 'C' },
    { value : 'Frank', type : 'B' },
    { value : 'Hakeem', type : 'A' },
    { value : 'Ali', type : 'C' },
    { value : 'Thomas', type : 'B' },
    { value : 'An', type : 'D' }
];

var copy = [];
for(var i = 0; i < data.length; i++){ 
    if (data[i].type !== "A" && data[i].type !== "B") {
        copy.push(data[i]);
    }   
}
data = copy;

document.body.innerHTML = JSON.stringify(data);

(另见this Fiddle

【讨论】:

  • 非常感谢!我超前地认为这是解决方案!很好很清楚的解释! @JohnSlegers
  • @JohnPower :我刚刚在我的答案底部添加了一条注释,并提供了一种替代实现,它可以为您提供更好的性能。
【解决方案2】:

在拼接的时候循环数组是有问题的,这里改用Array.filter

var filteredData = data.filter(function(d){
    return !(i.type === "A"|| i.type === "B");
});

【讨论】:

  • 在拼接时循环数组不是问题,只要你向后循环而不是向前循环。
  • @JohnSlegers,是的,但仍然认为filter 是更好的方法。它只是更容易阅读和更清晰的代码。
  • filter 的一个缺点是支持它的最早的 IE 版本是 IE9。虽然它比 splice 快,但仍然比创建新数组和复制相关位要慢 -> jsperf.com/splice-vs-filter
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 2013-07-22
  • 1970-01-01
  • 2011-11-30
  • 2011-08-20
  • 1970-01-01
相关资源
最近更新 更多