Почему объекты, добавленные в массив, все одинаковые, но консоль показывает на каждой итерации разные объекты

Задание следующие, данные два массива, надо на основе массива 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
  1. основная ошибка - использование глобального объекта 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);


  1. Неверно используется 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));

→ Ссылка