循环遍历数组并删除特定类型d3.js的元素

时间:2016-03-11 16:10:43

标签: javascript arrays loops d3.js

data是一个包含不同类型元素的数组。我想循环遍历此数组并删除类型为A并键入B的所有元素。这就是我到目前为止所做的:

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

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

有人可以告诉我为什么这是错的,我应该如何解决它!

提前致谢!

2 个答案:

答案 0 :(得分:2)

问题

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

  1. 你正在向前循环。如果要在循环遍历其元素时拼接数组,则需要向后循环。
  2. i.type应为data[i].typei只是一个数字,甚至没有type属性。
  3. 固定代码

    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" && 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

答案 1 :(得分:1)

在拼接时循环播放数组是有问题的,而是在这里使用Array.filter

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