Обновление объекта

239
05 июня 2018, 12:40

помогите пожалуйста. Есть 2 массива, один с объектами другой числовой. В числовом хранятся number из массива с объектами.

Как мне правильно найти посредством числового массива индекс объекта и изменить в объекте selected: true?

Сейчас с newArr происходит чудо, но сам arr меняет значение selected

var arr = [{ 
  name: 'Hello', 
  selected: false, 
  number: 14 
}, { 
  name: 'World', 
  selected: false, 
  number: 18 
}, { 
  name: '!', 
  selected: false, 
  number: 31 
}] 
 
var numbers = [14, 31]; 
 
var newArr = arr.map((item, index) => numbers.map((number) => item.number == number ? arr[index].selected = true : arr[index])) 
 
console.log(newArr)

Answer 1

Тут нужно понимать несколько вещей:

  • map получает на вход массив и возвращает новый массив
  • если элементом исходного массива был объект то он будет передан по ссылке (то есть item и arr[index] - суть один и тот же объект)
  • стрелочная функция в неблочном виде возвращает результат последней операции.

Чудеса стали возможны потому, что не были учтены базовые особенности map и стрелочных функций. Ну и явно не является эффективным решением перебор массива numbers для каждого элемента массива arr.

Из вопроса не совсем понятно какой именно вы хотите получить результат по этому продемонстрирую 3 (более эффективных) варианта:

  • изменяем selected в arr
  • создаём newArr из объектов массива arr
  • создаём newArr из копий объектов массива arr.

Поехали!

Изменяем selected в arr:

var arr = [{name: 'Hello', number: 14}, {name: 'World', number: 18}, {name: '!', number: 31}]; 
 
var numbers = [14, 31]; 
 
arr.forEach(x => x.selected = numbers.indexOf(x.number) > -1); 
 
console.log(arr);

Cоздаём newArr из объектов массива arr:

var arr = [{name: 'Hello', number: 14}, {name: 'World', number: 18}, {name: '!', number: 31}]; 
 
var numbers = [14, 31]; 
 
var newArr = arr.map(x => { 
                  x.selected = numbers.indexOf(x.number) > -1; 
                  return x; 
             }); 
 
console.log(newArr); 
console.log(arr);

Cоздаём newArr из копий объектов массива arr:

var arr = [{name: 'Hello', number: 14}, {name: 'World', number: 18}, {name: '!', number: 31}]; 
 
var numbers = [14, 31]; 
 
var newArr1 = arr.map(x => { 
                  var o = Object.assign({}, x); 
                  o.selected = numbers.indexOf(o.number) > -1; 
                  return o; 
             }); 
var newArr2 = arr.map(x => Object.assign({selected: (numbers.indexOf(x.number) > -1)}, x)); 
var newArr3 = arr.map(x => { 
                return { ...x , selected: (numbers.indexOf(x.number) > -1) }; 
}); 
 
console.log(newArr2); 
console.log(arr);

Answer 2

Вот таким образом:

var arr = [{ 
  name: 'Hello', 
  selected: false, 
  number: 14 
}, { 
  name: 'World', 
  selected: false, 
  number: 18 
}, { 
  name: '!', 
  selected: false, 
  number: 31 
}] 
 
var numbers = [14, 31]; 
 
var newArr = arr.map((item, index) => { 
  numbers.map((number) => { if (item.number == number)   arr[index].selected = true; return arr[index];}); return item;} ); 
 
console.log(newArr)

READ ALSO
Не получаю req.body после отправки запроса

Не получаю req.body после отправки запроса

Отправляю запрос, но в reqbody оказывается пусто {}, хотя я вижу что данные нормально уходят

194
Как сделать JSON-RPC запрос с клиента

Как сделать JSON-RPC запрос с клиента

Сделал небольшой сервачок с РПС и хочу с клиента отправить запрос, немогу найти примеры в нетеЕсть куча либ но нету чистого запроса, так что...

200
Помогите найти ошибку. Js

Помогите найти ошибку. Js

Мне надо написать программу, когда вводишь положительное число оно alert-ит положительное, когда отрицательное-отрицательное․

199
React и Сканер штрих кодов

React и Сканер штрих кодов

есть React приложение в котором можно осуществить поиск в списке товаров по имени, id, штрих кодуВесь этот поиск осуществляется с помощью одного...

173