2013-07-02 3 views
1
var cache = []; 
cache[0] = "0"; 
cache[1] = "1"; 
cache[2] = "2"; 
cache[3] = "3"; 
cache[4] = "4"; 
cache["r"] = "r"; 
console.log(cache.length); 
for(key in cache){ 
    if(isNaN(key))continue; 
    else cache.splice(key,1); // cache.splice(key) is working fine, *** 
} 
console.log(cache); 

Вопроса: в строке *** Почему сплайсинг (ключ) работает нормально (Удаление всех элементов с индексом Числового) и соединение (ключ, 1) не работают нормально (не Удаление элементов с помощью числового индекса). Даже я попробовалJavascript Массив сращивание Не работает отлично

splice(key,1) // Not working as splice(key) 
splice(key--,1) // Even not working as splice(key) 
splice(key,0) // not deleting any thing 

Вы можете копировать и вставлять код в Firebug консоли для тестирования.

+3

Можете ли вы пояснить, что «не работает»? Что происходит, когда вы пытаетесь использовать код и как он отличается от того, что вы ожидаете? Вы получаете сообщение об ошибке? – Guffa

+0

Функция сращивания удаляет элемент из массива. Он должен удалить весь элемент с числовым индексом, но его удаление немного –

+0

, поэтому сплайсинг ожидает, что я предоставил числовой индекс, поэтому (n, x) означает начало с числового индекса n и удаление значений x после индекса n. если n не является числовым, а ключом, то не нужно x. Так что он отлично работает x удаляется. –

ответ

1

сращивания ожидает первый индекс как числовой,

splice(n,x); //n and x are numeric here 

Он начнет удалять значения из массива, начиная с индекса n, и удаляет значения x после индекса n.

Теперь if n is not numeric but a key, тогда не нужно x, потому что x может перемещать указатель вперед в numeric-indexed array только не ассоциативный массив. Поэтому удаление x из сплайсинга (n, x) сделает функцию похожей на splice (key) и т. Д., И поэтому она будет работать нормально.

+0

Я ищу хороший способ удалить элементы из ассоциативного массива. Согласно этому ответу, [this] (http://jsfiddle.net/AL5LG/) должен работать, однако, как видно на консоли, он ничего не делает для ассоциативного массива. Использование 'delete' будет работать, как в [этом примере] (http://jsfiddle.net/AL5LG/2/) (хотя свойство' .length', похоже, работает ненормально). – JVE999

+0

сращивание (ключ) должно работать и сращивание (ключ, x) не будет работать. Просто удалите второй параметр из функции сращивания. –

+0

Какой ответ вы нашли правильным, позвольте мне проверить, если это лучший ответ, тогда я выберу его. –

2

1) cache["r"] = "r"; не добавляет элемент в массив, он добавляет свойство объекта кэша

Чтобы инициализировать массив, который вы можете использовать некоторые вещи, как

var cache = ["0", "1", "2", "3", "4", "r"]; 

или

var cache = new Array(); 
cache.push("0"); 
cache.push("1"); 
cache.push("2"); 
cache.push("3"); 
cache.push("4"); 
cache.push("r"); 

Поскольку ваш объект кеша не является массивом, вы не можете ожидать, что сплайсинг будет вести себя так же, как и для массива.

2) сращивание ожидает индекс в качестве первого аргумента, не является ключевым

см http://www.w3schools.com/jsref/jsref_splice.asp

Таким образом, вы могли бы использовать это, чтобы удалить все числовые значения:

for (var i = 0; i < cache.length; i++) { 
     if (!isNaN(cache[i])) { 
      cache.splice(i, 1); // cache.splice(key) is working fine, *** 
       i--; 
      } 
     } 
+0

ключ или индекс в моем случае. Я занимаюсь ассоциативным массивом javascript, а не числовым массивом. Пожалуйста, ищите google для ассоциативного массива и JSON, чтобы узнать больше :) –

+0

Согласно ответу на этот вопрос http://stackoverflow.com/questions/948894/splicing-a-string-indexed-array-in-javascript, вы можете использовать delete вместо splice, который не отвечает, почему splice (key, 1) не работает, но, по-видимому, его правильный способ удалить из строкового индексированного массива –

+0

После исследования ассоциативных массивов я поддерживаю свой ответ. Поскольку 'cache' не является массивом, вы не можете ожидать, что сплайсинг будет вести себя так, как есть. –

7

Это не работает, потому что вы удаляете элементы из массива, проходя через ключи. Когда вы удаляете элемент, он будет переупорядочивать другие элементы в зависимости от того, как массив реализован внутри, и вы получите цикл, который не перебирает ключи, которые вы ожидаете.

Когда я пытаюсь его в Firefox, это только перебирает ключи 0, 1, 2 и r. Удаление элементов во время итерации пропускает 3 и 4. Сам splice отлично работает, но он влияет на цикл, так что некоторые элементы просто не находятся в итерации.

Поскольку вы действительно ищете индексы в массиве, пропуская нечисловые ключи, вы можете просто прокрутить индексы. По перекручивание через них в обратном направлении, вы не получите проблемы с массивом изменения, пока вы цикл через него:

var cache = ["0", "1", "2", "3", "4"]; 
cache.r = "r"; 
console.log(cache.length); 
for (var i = cache.length - 1; i >= 0; i--) { 
    cache.splice(i, 1); 
} 
console.log(cache); 

Демо: http://jsfiddle.net/CguTp/1/

+0

удаление в обратном порядке - хорошая идея, но я использую ассоциативный массив. вы заслуживаете –

+0

мой вопрос, почему splice (key, 1) не работает на том же месте, где сращивание (ключ) работает очень хорошо. –

+0

@Wasim: Использование 'splice (key)' не работает, оно дает только тот же результат в этом случае, поскольку код пытается удалить все элементы. Он удалит все элементы из массива на первой итерации, но не будет удалять один элемент за раз. – Guffa

Смежные вопросы