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];
}
}