Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция для инициализации массива с объектами (https://javascript.ru/forum/misc/75451-funkciya-dlya-inicializacii-massiva-s-obektami.html)

R2R 10.10.2018 20:12

Функция для инициализации массива с объектами
 
Пытаюсь написать функцию, создающую массив указанного размера.

function createArray(size, value) {
  return [...Array(size)].map(() => value)
}

let arr = createArray(2, []);
arr[0].push(1);
console.log(arr[1]);  // [1]

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

рони 10.10.2018 20:26

R2R,
:-?
() => [...value]

R2R 10.10.2018 20:41

рони, к сожалению, для массива с функциями и объектами это решение не подходит.

Nexus 10.10.2018 20:45

function createArray(size, value) {
    const isScalar = ['boolean', 'null', 'undefined', 'number', 'string', 'symbol'].indexOf(typeof value) >= 0;
    if (!isScalar)
        value = JSON.stringify(value);


    return Array.from({
        length: size
    }, () => isScalar ? value : JSON.parse(value));
}

var obj = createArray(2, {}),
    arr = createArray(2, []);

obj[1].foo = 'bar';
arr[1].push(2);

console.log(obj, arr);

Aetae 10.10.2018 20:47

Ну допустим нет никакой адекватной причины клонировать функцию. А для всего остального тебе придётся писать(или гуглить) клонер со сложной логикой, учитывающей вложенность(в том числе рекурсивную, с которой JSON туда-сюда не поможет).


Часовой пояс GMT +3, время: 08:21.