array.map изменяет мой оригинальный массив - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь обновить поле в объекте в моем массиве.

Мой объект (упрощенный) выглядит примерно так:

{
  "readableStructure": [
    {
      "ID": "1",
      "Name": "Name 1",
      "Description": "Adding, updating or removing users",
      "IconName": "fas fa-users-cog"
    },
    {
      "ID": "2",
      "Name": "Name 2",
      "Description": "Views overview",
      "IconName": "fas fa-street-view"
    },
    {
      "ID": "3",
      "Name": "Name 3",
      "Description": "Improvements to apps",
      "IconName": "fas fa-broadcast-tower"
    },
    {
      "ID": "4",
      "Name": "Name 4",
      "Description": "Managing badges",
      "IconName": "fas fa-id-badge"
    },
    {
      "ID": "5",
      "Name": "Name 5",
      "Description": "Art",
      "IconName": "fas fa-hand-holding-heart"
    }
  ]
}

, и я называю это так:

prepareRepositories(this.props.primarySearchRepositories);

У меня может быть несколько похожих репо, и я перебираю их.И для каждого элемента в массиве readableStructure я пытаюсь добавить свойство с именем QSString, используя следующий код.

prepareRepositories(repositories) {

    const repos = repositories.map((repo, index) => {

        const searchableColumns = ['Name', 'Description'];
        const newRepo = [];
        newRepo[0] = {};
        newRepo[0].readableStructure = [];

        newRepo[0].readableStructure = repo[0].readableStructure.map((item) => {
            item.QSString = this.getSearchableString(item, searchableColumns) || 'blaha';
            return item;
        });

        return newRepo;
    });

    return repos;
}

getSearchableString = (base, searchableColumns) => {
    let searchables = [];

    Object.keys(base).forEach((key) => {
        if ((searchableColumns.indexOf(key) > -1) && (base[key] !== null) && (typeof base[key] !== 'object')) {
            searchables.push(base[key]);
        }
    });

    const searchableString = searchables.join(' ');
    return searchableString;
}

Однако, когда я делаю это, оригинальный объект изменяется, и свойство QSString устанавливается равным одному и тому же для каждого репо.

Что я делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

используя это не будет мутировать оригинальный объект

JSON.parse(JSON.stringify(your_object))
0 голосов
/ 05 июня 2018

Array.map не меняет исходный массив, т.е. создает новый массив.Однако любой объект в массиве продолжает хранить одинаковую ссылку , следовательно, любое изменение объекта, даже внутри функции карты, обновит объект в исходном массиве.

Вам необходимо создать копию для объекта .

item = JSON.parse(JSON.stringify(item))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...