Подтвердить что ты не робот

Добавить свойство в массив javascript

Массивы по умолчанию имеют свойство "длина".

Можно ли добавить к ним настраиваемые свойства?

Без создания объектов

4b9b3361

Ответ 1

Конечно.

var arr = [1,2,3,4,5];
arr.prop = 'value';

Массивы уже являются объектами в JavaScript - у них просто есть дополнительные функции и специальный литерал-синтаксис.

Ответ 2

Как утверждают другие ответы, это вполне возможно, потому что массивы в JavaScript - это просто объекты. Тем не менее, есть еще вопрос о том, хорошая ли это идея или нет.

Это вопрос "стиль кодирования", поэтому трудно сказать объективно, но у Дугласа Крокфорда нет проблем с ним (по крайней мере, в некоторых случаях). В JavaScript: Хорошие части он фактически использует пример добавления метода "total" к массиву.

Поскольку массив действительно является объектом, мы можем добавлять методы непосредственно к отдельному массиву:

// Give the data array a total function

data.total = function () {
    return this.reduce(add, 0);
};

total = data.total();    // total is 108

Так как строка 'total' не является целым числом, добавление в массив свойства total не изменяет его длину.

(p62, Крокфорд "JavaScript Хорошие детали", найденный в Google Books)

Однако стоит упомянуть, что эти дополнительные свойства не включены в сериализацию JSON и будут выброшены, если вы сделаете что-то вроде arr = arr.slice(1);.

Ответ 3

Да. Вы можете добавить их к объекту, просто объявив их, и вы также можете расширить Array с помощью Array.prototype

var j = new Array();
j.yourprop = "foo";

Ответ 4

Если вы хотели спрятать его в массиве и т.д.? [по крайней мере, то, что я искал.]

Object.defineProperty( targ, "myVal", { enumerable: false, writable: true } );

Затем массив не добавляет его к длине, поэтому свойство не значение, которое, я думаю, вы могли бы сказать.

Затем, если вы хотите, например, увидеть ключи в объекте, Object.keys не увидит его, но Reflect.ownKeys будет.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys

Версия Reflect для defineProperty вернет успех или потерпит неудачу, в то время как Object возвращает переданный объект.

Помните, что предупреждения будут (или, как говорится, запрещены) не позволяют вам или другим продлить их. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions

Ответ 5

Массивы - это объекты, поэтому вы можете добавить к ним свои собственные свойства:

var arr = [1, 2, 3]; arr.foo = 'bar';

Расширяясь от других ответов, рассмотрим следующие способы итерации по массиву, исключая пользовательские свойства.

1) Использование стандарта для цикла

for (let i = 0; i < arr_length; i++)
    console.log(arr[i]);

или если не используется ES6:

for (var i = 0; i < arr.length; i++)
    console.log(arr[i]);

2) Использование цикла for... of (ES6+)

for (let el of arr)
    console.log(el)

3) Использование Array.prototype.forEach (ES6+)

arr.forEach(el => console.log(el));

или же

arr.forEach(function(el) {
    console.log(el);
});

Итерирование по массиву, включая все свойства (например, пользовательские свойства, length)

for (let prop in arr)
    console.log(prop);

или если не используется ES6:

for (var prop in arr)
    console.log(prop);