Delete vs splice na tablicy asocjacyjnej

Jeśli mam tablicę asocjacyjną JS, która z tego, co zbieram, jest naprawdę obiektem i chcę usunąć element, użycie delete myArr[someId] ustawi element na undefined, podczas gdy splice nie będzie działać w ogóle... więc jaka jest alternatywa dla tablicy asocjacyjnej, jeśli chcę usunąć element (zamiast ustawiać go na undefined)

Author: sarsnake, 2011-11-17

2 answers

Terminologia w js może być na początku myląca, więc wyprostujmy to.

Tak, prawie wszystko w js jest obiektem. Istnieją jednak różnice w typach danych.

Tablica może być używana podobnie jak jako tablica asocjacyjna, ale różni się ona od obiektowej.

var x = []; //array
var y = {}; //object literal

Tablica jest jak lista. Klucze tablicy mogą być indeksem numerycznym lub łańcuchem znaków.

var x = ['a','b']; // x[0] === 'a', x[1] === 'b';
var x = [];
    x['one'] = 'a';
    x['blah'] = 'b'; 

Literały obiektów są jak słowniki. Mogą być stosowane w podobnym sposób.

var x = { 0: 'a', 1: 'b' };
var x = { one: 'a', two: 'b' };

Tutaj jednak musisz zrozumieć różnice.

Możesz używać tablicy Jak, ale nie możesz używać tablicy tak jak tablica.

Tablice mają automatyczną właściwość "length", która automatycznie zwiększa i zmniejsza się na podstawie całkowitej liczby elementów w tablicy. Nie rozumiesz tego z literałami obiektowymi. Tablice otrzymują również wszystkie inne metody specyficzne dla tablic, takie jak shift, unshift, splice, pop, push, itp. Literały obiektów nie mają takich metod.

Porozmawiajmy o delete i o tym, co dzieje się na tablicy i na dosłownym obiekcie.

var x = ['a', 'b']; //["a", "b"]
delete x[0]; //[undefined, "b"]

var x = {0:'1', 1:'b'}// { 0:"1", 1:"b"}
delete x[0]; // { 1:"b" }

Jeśli wykonasz polecenie delete na elemencie tablicy, długość tablicy nie ulegnie zmianie. Indeks elementu jest zachowany, a wartość jest ustawiona na 'undefined';

Odwrotnie, wykonanie delete na obiekcie literalnie usuwa klucz / wartość z obiektu.

Wreszcie, jeśli chcesz usunąć element z / align = "left" /

var x = ['a', 'b']; 
x.splice(0,1); //modifies x. ['b']

Tak więc, w podsumowaniu użyj delete na literałach obiektów. Użyj splice na tablicach.

Mam nadzieję, że to pomoże.
 159
Author: Geuis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-17 20:32:29

Nie ma innej opcji. myArr["someCrazyIndexYouHaventPreviouslyUsed"] zwróci undefined; tablica asocjacyjna zawsze da ci undefined dla indeksów, które nie istnieją.

Więc delete myArr[someId] spowoduje, że myArr potraktuje someId Jak każdy inny indeks, który nie istnieje-czy nie tego chcesz?

 5
Author: Adam Rackis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-17 19:48:51