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
)
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.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?
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