Вход

Просмотр полной версии : Функция для инициализации массива с объектами


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 туда-сюда не поможет).