#javascript #arrays #object #concatenation
Вопрос:
В настоящее время я борюсь с этой проблемой. Я просмотрел множество форумов и веб-сайтов и не получил ответа. Я хотел бы объединить два объекта в один массив без объединения с помощью этого конструктора объектов car, :
const car = {
year: '',
model: '',
mileage: '',
available_colors: [1, 2, 3], // numbers indicate color id
};
var garage = [];
const honda = Object.create(car);
const volvo = Object.create(car);
honda.available_colors[1] = 34;
volvo.available_colors[0] = 80;
honda.year = 1987;
volvo.year = 1990;
garage.push(honda, volvo);
console.log(garage);
Проблема в том, что вот результат, который у меня есть :
console.log(garage[0].available_colors,garage[1].available_colors);
-->[80,2,3] , [80,2,3]
console.log(garage[0].year, garage[1].year);
-->1987 , 1990
Проблема не возникает для других параметров, только для массива. Как у меня могут быть два отдельных массива доступных цветов, которые принадлежат каждому объекту отдельно?
Ответ №1:
honda.available_colors
и volvo.available_colors
ссылаются на один и тот же Array
объект.
Вместо этого вы можете создать новый массив для каждого автомобиля, используя копию slice
d car.available_colors
в качестве отправной точки для каждого:
honda.available_colors = honda.available_colors.slice();
honda.available_colors[1]=34;
volvo.available_colors = volvo.available_colors.slice();
volvo.available_colors[0]=80;
Это создаст новый экземпляр массива для каждого экземпляра автомобиля, поэтому они не будут использовать один и тот же массив. Обратите внимание, что это означает, что будущие изменения значения прототипа car.available_colors
не будут видны экземплярам после их создания: каждый экземпляр будет копировать состояние прототипа available_colors
во время создания.
Комментарии:
1. Спасибо вам, апсиллеры, за ваш любезный ответ 🙂 !
Ответ №2:
Вам нужно сделать неглубокую копию как car
объекта, так и available_colors
массива
Я использовал Object.assign
и spread
оператора
Вы можете прочитать о Object.assign
и spread
операторе здесь и здесь
const car= {
year:'',
model:'',
mileage:'',
available_colors:[1,2,3], // numbers indicate color id
}
var garage =[];
const honda = Object.assign({}, car);
const volvo = Object.assign({}, car);
honda.available_colors = [...honda.available_colors];
honda.available_colors[1] = 34;
volvo.available_colors= [...volvo.available_colors];
volvo.available_colors[0] = 80;
honda.year = 1987;
volvo.year = 1990;
garage.push(honda, volvo);
console.log(garage);
Комментарии:
1. Я воспользовался вашим решением и БОЛЬШОЕ вам спасибо, я бы никогда его не нашел 🙂 !
2. Хороший улов @apsillers, я только что обновил свой ответ.