使用另一个对象数组和一个对象构造一个对象数组

时间:2019-01-18 12:56:16

标签: javascript arrays object

我有一个这样的对象数组:

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 :(得分:1)

一个简单的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);

答案 1 :(得分:0)

此循环应执行此操作。

 for(var key in obj){
       channels[key].status = obj[key]
    }

答案 2 :(得分:0)

您可以使用任何喜欢的方法遍历obj(在这里我使用Object.keysobj对象中获取键数组,而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方法,它不会对原始数组进行突变,而是创建了一个新数组代替。

答案 3 :(得分:-1)

您可以使用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; }