Почему объекты, добавленные в массив, все одинаковые, но консоль показывает на каждой итерации разные объекты
Задание следующие, данные два массива, надо на основе массива map и массива users собрать новый массив объектов где в каждом объекте будут только те свойства которые перечислены в массиве map Сделал следующее:
const map = ["_id", "name", "isActive", "balance"];
const users = [
{
_id: "5d220b10e8265cc978e2586b",
isActive: true,
balance: 2853.33,
age: 20,
name: "Buckner Osborne",
gender: "male",
company: "EMPIRICA",
email: "[email protected]",
phone: "+1 (850) 411-2997",
registered: "2018-08-13T04:28:45 -03:00",
},
{
_id: "5d220b10144ef972f6c2b332",
isActive: true,
balance: 1464.63,
age: 38,
name: "Rosalie Smith",
gender: "female",
company: "KATAKANA",
email: "[email protected]",
phone: "+1 (943) 463-2496",
registered: "2016-12-09T05:15:34 -02:00",
},
{
_id: "5d220b1083a0494655cdecf6",
isActive: false,
balance: 2823.39,
age: 40,
name: "Estrada Davenport",
gender: "male",
company: "EBIDCO",
email: "[email protected]",
phone: "+1 (890) 461-2088",
registered: "2016-03-04T03:36:38 -02:00",
},
];
let value = {};
let newArr = [];
let i = 0;
const result = (users) => {
users.map((item, index, array) => {
for (let key of map) {
value[key] = item[key];
}
//console.log(value);
newArr[i] = value;
i++;
//newArr.push(value);
});
};
result(users);
console.log(newArr);
Вроде как можно все сделать проще через reduce, но как я начал можно решить?
Ответы (1 шт):
Автор решения: Grundy
→ Ссылка
основная ошибка - использование глобального объекта
value. На данный момент три раза добавляется ссылка на один и тот же объект. Для решения достаточно перенести объявление внутрьmap.const map = ["_id", "name", "isActive", "balance"]; const users = [{ _id: "5d220b10e8265cc978e2586b", isActive: true, balance: 2853.33, age: 20, name: "Buckner Osborne", gender: "male", company: "EMPIRICA", email: "[email protected]", phone: "+1 (850) 411-2997", registered: "2018-08-13T04:28:45 -03:00", }, { _id: "5d220b10144ef972f6c2b332", isActive: true, balance: 1464.63, age: 38, name: "Rosalie Smith", gender: "female", company: "KATAKANA", email: "[email protected]", phone: "+1 (943) 463-2496", registered: "2016-12-09T05:15:34 -02:00", }, { _id: "5d220b1083a0494655cdecf6", isActive: false, balance: 2823.39, age: 40, name: "Estrada Davenport", gender: "male", company: "EBIDCO", email: "[email protected]", phone: "+1 (890) 461-2088", registered: "2016-03-04T03:36:38 -02:00", }, ]; let newArr = []; let i = 0; const result = (users) => { users.map((item, index, array) => { let value = {}; for (let key of map) { value[key] = item[key]; } //console.log(value); newArr[i] = value; i++; //newArr.push(value); }); }; result(users); console.log(newArr);
- Неверно используется
map: метод.mapуже создает и заполняет новый массив, нет нужды дублировать это вручную и терять при этом результат самого.map.
const map = ["_id", "name", "isActive", "balance"];
const users = [{
_id: "5d220b10e8265cc978e2586b",
isActive: true,
balance: 2853.33,
age: 20,
name: "Buckner Osborne",
gender: "male",
company: "EMPIRICA",
email: "[email protected]",
phone: "+1 (850) 411-2997",
registered: "2018-08-13T04:28:45 -03:00",
},
{
_id: "5d220b10144ef972f6c2b332",
isActive: true,
balance: 1464.63,
age: 38,
name: "Rosalie Smith",
gender: "female",
company: "KATAKANA",
email: "[email protected]",
phone: "+1 (943) 463-2496",
registered: "2016-12-09T05:15:34 -02:00",
},
{
_id: "5d220b1083a0494655cdecf6",
isActive: false,
balance: 2823.39,
age: 40,
name: "Estrada Davenport",
gender: "male",
company: "EBIDCO",
email: "[email protected]",
phone: "+1 (890) 461-2088",
registered: "2016-03-04T03:36:38 -02:00",
},
];
const result = (users) => {
return users.map((item, index, array) => {
let value = {};
for (let key of map) {
value[key] = item[key];
}
return value;
});
};
result(users);
console.log(result(users));