Запутанное обновление JSON условно в цикле - PullRequest
0 голосов
/ 04 августа 2020

Я пишу код JS, который должен делать следующее.

  1. l oop по массиву json.
  2. в зависимости от условия добавьте новый элемент массива json.

Вот код, который я написал.

var a = [{
    'fName': 'a',
    'lName': 'b'
  },
  {
    'fName': 'a',
    'lname': 'c'
  },
  {
    'fName': 'x',
    'lName': 'z'
  }
];

var aClone = JSON.parse(JSON.stringify(a));
a.forEach(item => {
  if (item.fName == 'a') {
    aClone['newName'] = 'ab';
  } else if (item.fName = 'x') {
    aClone['newName'] = 'cd';
  }
});

console.log(aClone);

Я знаю, что в моем коде есть ошибка, но не могу понять, где она.

Мой ожидаемый результат такой, как показано ниже.

[
  {
    "fName": "a",
    "lName": "b",
    "newName": "ab"
  },
  {
    "fName": "a",
    "lname": "c",
    "newName": "ab"
  },
  {
    "fName": "x",
    "lName": "z",
    "newName": "cd"
  }
]

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

Спасибо

1 Ответ

2 голосов
/ 04 августа 2020

Вы почти получили это. Ваша основная проблема заключалась в следующем:

aClone['newName'] = 'ab';

Вместо этого должно быть следующее:

item['newName'] = 'ab';

Предложение

Вы можете уменьшить часть своего кода, сопоставив непосредственно с clone.

  1. Используйте map вместо forEach
  2. Измените item вместо
  3. Верните item

var a = [{
  'fName': 'a',
  'lName': 'b'
}, {
  'fName': 'a',
  'lname': 'c'
}, {
  'fName': 'x',
  'lName': 'z'
}];

var aClone = JSON.parse(JSON.stringify(a)).map(item => {
  if (item.fName == 'a') {
    item['newName'] = 'ab';
  } else if (item.fName = 'x') {
    item['newName'] = 'cd';
  }
  return item;
});

console.log(aClone);
.as-console-wrapper { top: 0; max-height: 100% !important; }

Альтернатива

Вот альтернативный подход, использующий оператор распространения для клонирования элемента и применения нового свойства, вычисляемого переключателем.

var a = [{
  'fName': 'a',
  'lName': 'b'
}, {
  'fName': 'a',
  'lname': 'c'
}, {
  'fName': 'x',
  'lName': 'z'
}];

const calcNewName = (item) => {
  switch (item.fName) {
    case 'a' : return 'ab';
    case 'x' : return 'cd';
    default  : return null;
  }
}

const aClone = a.map(item => ({ ...item, 'newName' : calcNewName(item) }));

console.log(aClone);
.as-console-wrapper { top: 0; max-height: 100% !important; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...