Jump to content
  • 0

splice не удаляет по не цифровым ключам


iillyyaa2
 Share

Question

<script>
var myar = new Array();
myar['opa'] = 'uxaxa';
myar.splice('opa', 1);
alert(myar['opa']);
</script>

как мне удалить этот элемент ? я понял, что splice для этого не подходит..

в принципе можно его за-null-ить, и if (!myar['opa']) нормально сработает, но элемент то в массиве всё равно есть...

Link to comment
Share on other sites

22 answers to this question

Recommended Posts

  • 0

<script>
var myar = new Array();
myar['opa'] = 'uxaxa';
myar.splice('opa', 1);
alert(myar['opa']);
</script>

как мне удалить этот элемент ? я понял, что splice для этого не подходит..

в принципе можно его за-null-ить, и if (!myar['opa']) нормально сработает, но элемент то в массиве всё равно есть...

А причём тут 'opa' ? удалять нужно номер массива и длину.

Link to comment
Share on other sites

  • 0

как мне удалить этот элемент ? я понял, что splice для этого не подходит..

Не подходит. Потому что то что ты написал это не массив, а объект.

Соответственно не new Array(), а new Object()

И вместо myar.splice('opa', 1) - delete myar['opa']

Link to comment
Share on other sites

  • 0

а разве массив не может быть с не цифровыми ключами ??

<script>
var myar = new Array();
myar['opa'] = 'uxaxa';
delete myar['opa'];

alert(myar['opa']);
</script>

так тоже работает ;) разве правильнее использовать объект ?? зачем ?

Ключи есть у объектов, а у массивов - номера.

<script>
var myar = new Array();
myar['opa'] = 'uxaxa';
delete myar['opa'];

alert(myar['opa']);
</script>

так тоже работает ;) разве правильнее использовать объект ?? зачем ?

Потому что тут ты использовал свойства самого массива, а НЕ его номера или номеров.

Массив - это тоже объект как бы, а все объекты могут иметь свойства.

Link to comment
Share on other sites

  • 0

но мне свойства не нужны, и по этому логичнее использовать массив ?

Тогда и делай всё логично.

я не понял, так как "правильнее" ? :)

если у меня нет никаких свойств, только ar['key'] = 'value'; и не более.

Link to comment
Share on other sites

  • 0

но мне свойства не нужны, и по этому логичнее использовать массив ?

Тогда и делай всё логично.

я не понял, так как "правильнее" ? :)

если у меня нет никаких свойств, только ar['key'] = 'value'; и не более.

var obj = {};

obj.key = value;

  • Like 1
Link to comment
Share on other sites

  • 0

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

Первые два параметра должны быть цифрами.

1) индекс элемента массива, с которого начнется удаление

2) количество элементов которое надо удалить

В JavaScript нет ассоциативных массивов как в PHP поэтому если хочется удалять/добавлять элементы по ключу, то помогут только объекты (хеши).

  • Like 1
Link to comment
Share on other sites

  • 0

но в любом случае, так работает ;)

<script>
var myar = new Array();
myar['opa'] = 'uxaxa';
delete myar['opa'];

alert(myar['opa']);
</script>

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

Link to comment
Share on other sites

  • 0

Вы просто не понимаете как данная конструкция работает. Вот вам и кажется, что все круто :)


var myarr = new Array();
myarr['opa'] = 'uxaxa';

for (var i = 0; i < myarr.length; i++) {
alert(myarr[i]); // ой, нет такого алерта!
}

alert('длина массива = ' + myarr.length); // длина массива = 0 (как так?)

Link to comment
Share on other sites

  • 0

но мне это и не надо :) (узнать длину массива)

у меня все ключи "именные", и я знаю как к ним обратиться..

делаю с целью не плодить переменные, а загнать "переменные" в массив...

вместо:

var xx;

var zz;

var hh;

я делаю

var ar = new Array();

и дальше засовываю их внутрь

ar['xx'] = 17;

или даже делаю вложенный массив

ar['zz'] = new Array();

я понял, что можно делать тоже самое и с объектом... но, в чём плюсы или минусы ??

я ведь могу перебрать массив так же как и объект... я лично пока не нашел разницы :)

<script>
var myar = new Array();
myar['opa'] = 'uxaxa';
//delete myar['opa'];

for(var key in myar) {
alert(key + " = " + myar[key]);
}
</script>

если массив выполняет все задачи, зачем использовать объект ??

в чём же отличие ? :)

Edited by iillyyaa2
Link to comment
Share on other sites

  • 0

но мне это и не надо :) (узнать длину массива)

у меня все ключи "именные", и я знаю как к ним обратиться..

делаю с целью не плодить переменные, а загнать "переменные" в массив...

вместо:

var xx;

var zz;

var hh;

я делаю

var ar = new Array();

и дальше засовываю их внутрь

ar['xx'] = 17;

или даже делаю вложенный массив

ar['zz'] = new Array();

я понял, что можно делать тоже самое и с объектом... но, в чём плюсы или минусы ??

я ведь могу перебрать массив так же как и объект... я лично пока не нашел разницы :)

<script>
var myar = new Array();
myar['opa'] = 'uxaxa';
//delete myar['opa'];

for(var key in myar) {
alert(key + " = " + myar[key]);
}
</script>

если массив выполняет все задачи, зачем использовать объект ??

в чём же отличие ? :)

Ты полный бред несёшь. На лицо полное непонимание того, что вообще происходит. Я тебе уже говорил про книжки что нибудь? Почему ты никогда ничего не читаешь, а сразу идёшь спорить на форум?

Link to comment
Share on other sites

  • 0

я не спорю, я спрашиваю... оно ведь работает ? или так оно не должно работать ?

я вот хочу понять, почему нужно использовать объект вместо массива, хотя массив справляется с поставленной задачей...

в чём разница то ?

Link to comment
Share on other sites

  • 0

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


<script>
var myar = {};
myar.opa = 'uxaxa';
//delete myar['opa'];

for (var key in myar) {
alert(key + " = " + myar[key]);
}
</script>

UPD: Еще дополню. В яваскрипте почти всё - объекты. Поэтому когда вы пишете:

var myar = new Array();

то создается объект. А когда вы пишете:

myar['opa'] = 'uxaxa';

то создается не элемент массива, а свойство объекта.

И это очень важно понимать, чтобы потом не удивляться почему не работают методы для работы с массивами, например .splice(). Естественно они не работают, потому что вы не добавили ни одного элемента в массив, массив у вас пустой. Зато вы добавили новое свойство к объекту myar, который является экземпляром класса Array. Теперь понятно почему в вашем случае нет никакого смысла писать var myar = new Array();?

Link to comment
Share on other sites

  • 0

var myar = new Array();

то создается объект. А когда вы пишете:

myar['opa'] = 'uxaxa';

то создается не элемент массива, а свойство объекта.

И это очень важно понимать, чтобы потом не удивляться почему не работают методы для работы с массивами, например .splice(). Естественно они не работают, потому что вы не добавили ни одного элемента в массив, массив у вас пустой. Зато вы добавили новое свойство к объекту myar, который является экземпляром класса Array. Теперь понятно почему в вашем случае нет никакого смысла писать var myar = new Array();?

короче я понял, переделаю всё под объекты B)

мне проще различать текст, когда он формата

ar['ff'] вместо ar.ff

в первом случае понятно, что эту хрень написал я, а во втором случае, это может быть какой то существующий объект или свойство...

Link to comment
Share on other sites

  • 0
мне проще различать текст, когда он формата

ar['ff'] вместо ar.ff

Эти две записи в яваскрипте эквивалентны. Просто очень многие программисты, которые сперва писали на PHP, думают, что написав ar['ff'] они создадут элемент массива, а на самом деле они создают свойство объекта.

UPD: Если вы хотите объединить в одном месте несколько переменных, то лучше всего сделать так:


var params = {
a: 1,
b: 2,
opa: 'uxaxa'
};

alert(params['opa']);
alert(params.a);
alert(params['b']);

Link to comment
Share on other sites

  • 0

переменные заполняются по ходу.. многие даже не будут и заполнены...

мне проще объявить 1 раз объект и потом работать с элементами :)

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

Link to comment
Share on other sites

  • 0

Это и есть объект. Ничто не мешает потом добавить к нему новые свойства.


var params = {
a: 1,
b: 2,
opa: 'uxaxa'
};

alert(params['opa']);
alert(params.a);
alert(params['b']);

params.x = 'trololo';
params['test'] = 'OMG';

alert(params['x']);
alert(params.test);

if (params['x']) {
alert('x присутствует');
}

if (!params.y) {
alert('y отсутствует');
}

  • Like 1
Link to comment
Share on other sites

  • 0

спасибо, понял... привык к массивам в пхп... их там даже объявлять не надо B)

на яваскрипте работал всегда с массивами.. работал конечно и с объектами, к примеру полученными через подгрузку данных или от вконтакта.. но сам их не создавал :)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy