Создайте массив объектов, используя другой массив объектов и один объект - PullRequest
0 голосов
/ 18 января 2019

У меня есть массив объектов, подобный этому:

channels=[
  {name: mega, status: true},
  {name: ant, status: false},
  {name: apl, status: true}
]

и у меня есть один объект с этим форматом

obj = {0: false, 1: true}

Ключи в простом объекте представляют индексы массива channels. Свойства status должны быть обновлены.

Для приведенного выше примера данные channels должны быть обновлены до:

channels=[
  {name: mega, status: false},
  {name: ant, status: true},
  {name: apl, status: true}
]

Как я могу реализовать это эффективно?

Ответы [ 4 ]

0 голосов
/ 18 января 2019

Вы можете перебирать obj любым способом, который вам нравится (здесь я использовал Object.keys, чтобы получить массив ключей от obj объекта и forEach для их итерации) и обновите поле.Это может быть достигнуто в одной строке кода:

const channels = [
  {name: "mega", status: true},
  {name: "ant", status: false},
  {name: "apl", status: true}
];

const obj = {
  "0": false,
  "1": true
};

Object.keys(obj).forEach((item, i) => channels[i].status = obj[i]);

/**
 * If "channels" array is NOT ALWAYS longer than the amount of "obj" properties,
 * you should add the check for existence, the simpliest one is implemented below:
 * 
 * Object.keys(obj).forEach((item, i) => channels[i] ? channels[i].status = obj[i] : null);
 */
console.log(channels);

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

0 голосов
/ 18 января 2019

Этот цикл должен сделать это.

 for(var key in obj){
       channels[key].status = obj[key]
    }
0 голосов
/ 18 января 2019

Вы можете перебрать массив channels с помощью forEach() и использовать Object.assign() для переопределения свойства.

let channels = [
  {name: 'mega', status: true },
  {name: 'ant' , status: false},
  {name: 'apl' , status: true }
];

let obj = {
  0: false,
  1: true
};

channels.forEach((o, i) => i in obj ? Object.assign(o, {status: obj[i]}) : o);

console.log(channels);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 18 января 2019

Простой цикл for сделает:

for (let index in obj) channels[index].status = obj[index];

const channels=[{name: "mega", status: true}, {name: "ant", status: false}, {name: "apl", status: true}];

const obj={0: false, 1:true};

for (let index in obj) {
	channels[index].status = obj[index];
}

console.log(channels);

Если вы не хотите изменять исходный массив, но хотите новый массив с изменениями, то:

const channels=[{name: "mega", status: true}, {name: "ant", status: false}, {name: "apl", status: true}];

const obj={0: false, 1:true};

const result = channels.map(({name, status}, i) => 
    ({name, status: i in obj ? obj[i] : status})
);

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...