【问题标题】:Trouble removing elements from multidimensional array using for loop (javascript)使用for循环从多维数组中删除元素时遇到问题(javascript)
【发布时间】:2013-04-01 17:01:27
【问题描述】:

我正在用我的菜鸟头撞墙...

我有以下代码:

var guns2 = 
[
["Model 17", "Glock"],
["Model 19", "Glock"],
["PPQ", "Walther"],
["P2000", "HK"],
["Model 92", "Beretta"],
["Model 34", "Glock"]
]

var gunsMake = function () {
    for (i=0; i<guns2.length; i++){
        var make = guns2[i][1];
            if (make ==="Glock"){
                }
            else {
                guns2.splice(i,1);
                }
        };
    };
gunsMake();
console.log(guns2);

我在控制台得到的结果如下:

[["Model 17", "Glock"], ["Model 19", "Glock"], ["P2000", "HK"], ["Model 34", "Glock"]]

我想看到的是:

[["Model 17", "Glock"], ["Model 19", "Glock"], ["Model 34", "Glock"]]

"["P2000", "HK"]" 不应该在那里...我感觉它与 for 循环中的 "guns2.length" 参数有关..它似乎每次拼接时都会跳过后续数组,但我无法完全解决问题。

请有人引导我正确:)

【问题讨论】:

  • 在迭代数组时不要修改它。将所需结果插入到不同的数组中。
  • 啊,这很有意义,尤其是对于我需要实现的最终目标。 “推动”是实现这一目标的有效方式吗?
  • 是的,push 是向数组添加元素的一种方法。您需要先创建一个不同的数组,然后在循环中创建push

标签: javascript multidimensional-array splice


【解决方案1】:

在迭代数组时修改数组通常不是一个好主意,因为很难跟踪索引和退出条件。要么将所需的结果插入到单独的数组中,要么使用原生的filter 方法返回过滤后的数组。

var gunsMake = function (guns, desiredMake) {
    return guns.filter(function(v,i,a){
        return v[1] == desiredMake;
    });
};
guns2 = gunsMake(guns2, "Glock");
console.log(guns2);

有关 MDN 上的数组 filter 方法的更多信息:Array filter method

【讨论】:

  • 阿萨德,再次感谢您在这方面的帮助。我会给过滤器一个镜头——看起来是一个非常强大的方法。非常感谢。
  • 是的,没问题。您还应该查看其他 Array 方法(在 MDN 上记录)。一旦你熟悉了它们,它们就几乎不需要在大多数情况下使用 for 循环了。
【解决方案2】:

当您使用固定索引循环遍历数组时,您正在从数组中删除(拼接)节点。因此,您并没有检查所有元素。

如果您检查元素 #1 并决定删除它,那么当您检查 #2 时,您实际上是在检查 #3。

【讨论】:

  • 是的,这就是我的想法(感谢您的确认)。我只是不确定如何正确地做到这一点。
【解决方案3】:

就地修改数组并不总是很糟糕。如果您决定这样做,请在删除元素时减少 i

http://jsfiddle.net/kVzLn/

var guns2 = 
[
["Model 17", "Glock"],
["Model 19", "Glock"],
["PPQ", "Walther"],
["P2000", "HK"],
["Model 92", "Beretta"],
["Model 34", "Glock"]
]

var gunsMake = function () {
    for (i=0; i<guns2.length; i++){
        var make = guns2[i][1];
            if (make ==="Glock"){
                }
            else {
                guns2.splice(i--,1); // Decrement i here
                }
        };
    };
gunsMake();
console.log(guns2);

【讨论】:

  • 太棒了。对于这个特定的应用程序,我可能会接受 Asad 的推送到新阵列的建议,但你的建议就像一个魅力。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 2019-02-02
  • 2012-04-27
相关资源
最近更新 更多