Как сопоставить значения массива с массивами внутри объекта в Javascript? - PullRequest
0 голосов
/ 13 июня 2018

У меня есть объект, который выглядит следующим образом:

const data = [
  {name: 'Week 1', owner: 0, others: 4, amt: 4},
  {name: 'Week 2', owner: 0, others: 7, amt: 7},
  {name: 'Week 3', owner: 0, others: 10, amt: 10},
  {name: 'Week 4', owner: 0, others: 12, amt: 12},
  {name: 'Week 5', owner: 0, others: 3, amt: 3},
  {name: 'Week 6', owner: 0, others: 0, amt: 0},
  {name: 'Week 7', owner: 0, others: 9, amt: 9},
];

У меня есть два массива, а именно:

var arrayOwner = [0,0,0,0,0,0,0];
var arrayOthers = [2,4,3,6,3,8,9];

Проблема в том, что мне нужно принять первое значение каждого массива(arrayOwner и arrayOthers), а затем обновите первый объект в массиве данных.

Например, для недели 1 будут взяты 0 из arrayOwner и 2 из arrayOthers, а затем обновленыв первом объекте массива данных.

Ответы [ 4 ]

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

Вы можете взять вспомогательный объект и массив для ключей и цикла при повторном просмотре индекса для обновления.

const
    data = [{ name: 'Week 1', owner: 0, others: 4, amt: 4 }, { name: 'Week 2', owner: 0, others: 7, amt: 7 }, { name: 'Week 3', owner: 0, others: 10, amt: 10 }, { name: 'Week 4', owner: 0, others: 12, amt: 12 }, { name: 'Week 5', owner: 0, others: 3, amt: 3 }, { name: 'Week 6', owner: 0, others: 0, amt: 0 }, { name: 'Week 7', owner: 0, others: 9, amt: 9 }],
    arrayOwner = [0, 0, 0, 0, 0, 0, 0],
    arrayOthers = [2, 4, 3, 6, 3, 8, 9],
    update = { owner: arrayOwner, others: arrayOthers };

data.forEach((o, i) => ['owner', 'others'].forEach(k => o[k] = update[k][i]));
    
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 13 июня 2018

Отображение data

Вы можете просто сопоставить с помощью метода .map свой массив data и обновить два значения объекта: owner и others.

Метод .map создает новый массив с результатами вызова предоставленной функции для каждого элемента в вызывающем массиве.

- MDNвеб-документы

Обратный вызов, предоставленный .map, может принимать несколько аргументов: здесь мы будем использовать:

  • currentValue: e

  • индекс: i

Вот код, который будет выполнять сопоставление:

const res = data.map((e,i) => {
  e.owner = arrayOwner[i];
  e.others = arrayOthers[i];
  return e
})

Полный код:

const data = [
  {name: 'Week 1', owner: 0, others: 4, amt: 4},
  {name: 'Week 2', owner: 0, others: 7, amt: 7},
  {name: 'Week 3', owner: 0, others: 10, amt: 10},
  {name: 'Week 4', owner: 0, others: 12, amt: 12},
  {name: 'Week 5', owner: 0, others: 3, amt: 3},
  {name: 'Week 6', owner: 0, others: 0, amt: 0},
  {name: 'Week 7', owner: 0, others: 9, amt: 9},
];

const arrayOwner = [0,0,0,0,0,0,0];
const arrayOthers = [2,4,3,6,3,8,9];

const res = data.map((e,i) => {
  e.owner = arrayOwner[i];
  e.others = arrayOthers[i];
  return e;
})

console.log(res)

Использование цикла

На самом деле вы можете изменить data без необходимости определения отдельного массива для получения модифицированного массива.Мы будем использовать .forEach, данный обратный вызов будет таким же, как и ранее:

data.forEach((e,i) => {
  e.owner = arrayOwner[i];
  e.others = arrayOthers[i];
  return e;
});

Здесь data должен быть изменяемым, не определяйте data с помощьюconst.Вместо этого используйте var или let.

let data = [
  {name: 'Week 1', owner: 0, others: 4, amt: 4},
  {name: 'Week 2', owner: 0, others: 7, amt: 7},
  {name: 'Week 3', owner: 0, others: 10, amt: 10},
  {name: 'Week 4', owner: 0, others: 12, amt: 12},
  {name: 'Week 5', owner: 0, others: 3, amt: 3},
  {name: 'Week 6', owner: 0, others: 0, amt: 0},
  {name: 'Week 7', owner: 0, others: 9, amt: 9},
];

const arrayOwner = [0,0,0,0,0,0,0];
const arrayOthers = [2,4,3,6,3,8,9];

data.forEach((e,i) => {
  e.owner = arrayOwner[i];
  e.others = arrayOthers[i];
  return e;
});

console.log(data);

Примечание по структуре данных

Если вы хотите более короткую версию, вы можете установить другую структуру данных для arrayOwners и arrayOthers.Может быть, они находятся в одном массиве, вместо:

[arrayOwners[0], arrayOwners[1], ...]

и

[arrayOthers[0], arrayOthers[1], ...]

имеют:

[ [arrayOwners[0], arrayOthers[0]], [arrayOwners[1], arrayOthers[1]], ... ]

Итак, вы бы отобразили это так:

const res = data.map((e,i) => {
  [ e.owner, e.others ] = arrayMods[i]
  return e;
})

Выше я использую деструктурирующее назначение , чтобы установить e.owner на arrayMods[i][0] и e.others на arrayMods[i][1].Что удобнее.

const data = [
  {name: 'Week 1', owner: 0, others: 4, amt: 4},
  {name: 'Week 2', owner: 0, others: 7, amt: 7},
  {name: 'Week 3', owner: 0, others: 10, amt: 10},
  {name: 'Week 4', owner: 0, others: 12, amt: 12},
  {name: 'Week 5', owner: 0, others: 3, amt: 3},
  {name: 'Week 6', owner: 0, others: 0, amt: 0},
  {name: 'Week 7', owner: 0, others: 9, amt: 9},
];

const arrayMods = [[0,2],[0,4],[0,3],[0,6],[0,3],[0,8],[0,0]];

const res = data.map((e,i) => {
  [ e.owner, e.others ] = arrayMods[i]
  return e;
})

console.log(res)
0 голосов
/ 13 июня 2018

Вы можете использовать Array#map, чтобы обновить объект значением arrayOwner & arrayOthers

 data.map((obj, key) => {
  data.owner = arrayOwner[key] ; // update current object with value from
  data.other = arrayOthers[key] ; //arrayOwner and arrayOthers
  return data;
});
0 голосов
/ 13 июня 2018

Просто попробуйте:

data.forEach((item, key) => {
  item.owner = arrayOwner[key];
  item.others = arrayOthers[key];
});

Или без непосредственного изменения объекта data:

const newData = data.map((item, key) => ({
  ...item,
  owner: arrayOwner[key],
  others: arrayOthers[key],
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...