удаление определенного объекта в массиве JavaScript - PullRequest
1 голос
/ 02 сентября 2011

я делаю тест на удаление объектов внутри массива ... так как это тест, это скорее неформальный код ..

<script type="text/javascript">

// initialize array and objects
var fruits = new Array();

var z = {
  test1: "test0",
  test2: "test2"
}

fruits.push(z);
var z2 = {
  test1: "test1",
  test2: "test2"
}
fruits.push(z2);
var z3 = {
  test1: "test2",
  test2: "test2"
}
fruits.push(z3);
var z4 = {
  test1: "test3",
  test2: "test2"
}
fruits.push(z4);
var z5 = {
  test1: "test4",
  test2: "test2"
}
fruits.push(z5);

// display array length
document.write("array length is " + fruits.length + "<br>");

// traverse array
for(var x = 0; x < fruits.length; x++){

  // display object content in array
  document.write(fruits[x].test1 + " ");

  // delete object in array where variable test1 is equal to "test2"
  if(fruits[x].test1 == "test2"){
    fruits.splice(x, 1);
    //document.write("array length is " + fruits.length + "<br>");
  }
}
</script>

теперь этот код работает нормально (удаление объекта в массиве), но он удаляет один после того, который я хочу удалить (в приведенном выше коде я хочу удалить объект в индексе 2, но он удаляет объект в индексе 3)

Что-то я делаю не так в этом коде?

TIA:)

Ответы [ 3 ]

6 голосов
/ 02 сентября 2011

Вы никогда не должны пытаться изменить массив во время итерации. Вместо этого сохраните индекс элемента, который вы хотите удалить, в переменной и удалите его после цикла for.

0 голосов
/ 02 сентября 2011

Использовать '' фильтр '' в качестве реализовано в underscore.js:

_.filter(fruits, function (fruit) {
    return fruit.test1 !== "test2";
});

Это имеет преимущество в использовании быстрого, собственного метода JavaScript ('' фильтр '')где доступно.

0 голосов
/ 02 сентября 2011

Это должно работать:

<script type="text/javascript">

    // initialize array and objects
    var fruits = new Array();

    var z = {
      test1: "test0",
      test2: "test2"
    }

    fruits.push(z);
    var z2 = {
      test1: "test1",
      test2: "test2"
    }
    fruits.push(z2);
    var z3 = {
      test1: "test2",
      test2: "test2"
    }
    fruits.push(z3);
    var z4 = {
      test1: "test3",
      test2: "test2"
    }
    fruits.push(z4);
    var z5 = {
      test1: "test4",
      test2: "test2"
    }
    fruits.push(z5);

    // display array length
    document.write("array length is " + fruits.length + "<br>");

    // traverse array
    for(var x = 0; x < fruits.length; x++){

      // display object content in array
      document.write(fruits[x].test1 + " ");

      // delete object in array where variable test1 is equal to "test2"
      if(fruits[x].test1 == "test2"){
        fruits.splice(x-1, 1);
        //document.write("array length is " + fruits.length + "<br>");
      }
    }
    </script>
...