Задать вопрос
@tenaro

Vue. Как скопировать массив и отключить реактивность?

есть реактивный массив, как сделать локальную копию для манипуляций, которые не затронут исходные данные?
items = [...] // реактивный массив
localItems = items
localItems.push(data) // данные добавляются в items, надо это предотвратить

знаю способ с JSON.parse(JSON.stringify(items)) - но выглядит это не очень, как это сделать лучше?
  • Вопрос задан
  • 1269 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
SergeyKuzmenko
@SergeyKuzmenko
_.cloneDeep(value)

localItems = _.cloneDeep(items)
Ответ написан
@deliro
В JS удивительный мир костылей. Копировать массив через JSON.parse(JSON.stringify(items))? Серьёзно? А вы кофе по утрам пьёте каждый раз покупая в ближайшем магазине кофеварку и возвращая её назад?

JSON.parse(JSON.stringify(items)) мало того, что супер дурацкий способ сделать deep copy, мало того, что самый медленный, ведь вы превращаете всё в строки, а затем парсите их назад, так более важно ещё и то, что будь у вас в этом массиве экземпляры классов, они тупо все сломаются. Этот способ работает только с примитивными типами данных и двумя контейнерами: Object и Array.

Вот так можно делать для shallow copy (а зачем вам deep, кстати?):
const arrayOne = [1, 2, 3];
const arrayCopy = [...arrayOne];


const arrayOne = [1, 2, 3];
const arrayCopy = arrayOne.concat();


const arrayOne = [1, 2, 3];
const arrayCopy = Array.from(arrayOne);


Пожалуйста, перестаньте писать квадраты
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы