concat (в JavaScript) не работает для ассоциативных массивов

У меня проблема с объединением двух ассоциативных массивов в JavaScript. Ниже приведен пример кода:

var firstArray =  new Array();
firstArray.c1 = "sam";  
firstArray.c2 = "kam";
var secArray =  new Array();
secArray.c3 = "sam";    
secArray.c4 = "kam";
var res = firstArray.concat(secArray);

Это известное ограничение?

каков наилучший способ достичь этого?

5 ответов


вы не используете Array функциональность - просто Object функциональность. В JavaScript Object является ассоциативным массивом-вы используете Array для массивов с целочисленными индексами. Если вы сделали

var firstArray =  new Array();
firstArray.push("sam");  
firstArray.push("kam");
var secArray =  new Array();
secArray.push("sam");    
secArray.push("kam");
var res = firstArray.concat(secArray);

затем concat будет работать, как ожидалось.

если вы действительно хотите объединить ассоциативные массивы, делать:

for (var attr in src_array) { dest_array[attr] = src_array[attr]; }

это, конечно, перезапишет существующие ключи в dest_array, которые имеют аналоги в src_array.


попробуйте это,

var firstArray = new Array("sam","kam");
var secArray = new Array("sam","kam");
var res = firstArray.concat(secArray);

JavaScript не имеет ассоциативных массивов, он имеет хэши объектов. Вы создаете массив и присваиваете значения некоторым его свойствам, а не самому массиву.

ваш конкат не будет работать, потому что значения являются свойствами объекта. Чтобы сделать конкат так, как у вас есть, вам нужно будет объединить два объекта. Yui, jQuery и другие фреймворки JavaScript предоставляют полезные методы для этого.


строго говоря, это вообще не ассоциативные массивы: это массивы нулевой длины с дополнительными именованными свойствами. Назначение этих свойств работает, потому что массивы и объекты в JavaScript, но это не делает их ассоциативный массив. Лучше смотреть на них как на хеши.

методы массива, такие как concat будет работать только с численно-индексированными элементами массивов, а не со свойствами объектов-даже если эти объекты матрицы.


массивы в JavaScript имеют только числовые ключи. Только объекты могут иметь не числовые свойства. Поэтому попробуйте вместо этого:

var firstArray = {};
firstArray.c1 = "sam";
firstArray.c2 = "kam";
var secArray =  {};
secArray.c3 = "sam";  
secArray.c4 = "kam";

for (var prop in secArray) {
    if (secArray.hasOwnProperty(prop)) {
        firstArray[prop] = secArray[prop];
    }
}