【问题标题】:Loop over an object and assign a value to an array of objects if certain conditions are met - vanilla JavaScript如果满足某些条件,则循环对象并为对象数组赋值 - vanilla JavaScript
【发布时间】:2018-10-29 22:06:20
【问题描述】:

假设我有一个这样的对象(这里可能有很多项目);

myObject:{
 item1: {
  visible: true;
 },
 item2: {
  visible: true;
 },
 item3: {
  visible: false;
 },
}

然后是这样的对象数组(这里可能有很多项目);

var objs = [ 
    { name: 'item1', visible: false },
    { name: 'item2', visible: false },
    { name: 'item3', visible: false }
];

如何遍历对象并将可见的值分配给数组仅当名称匹配时 - 如果对象中的Item1是visible: false,那么数组中的item1必须反映这一点

【问题讨论】:

  • 不要循环遍历对象。循环遍历数组。通过 objs.name 查找元素,并设置 objs.visible 等于找到的元素的子键 visible

标签: javascript arrays object lodash


【解决方案1】:

最有效的方法是遍历数组,因为您只迭代数组一次。

const myObject = {
 item1: {
  visible: true
 },
 item2: {
  visible: true
 },
 item3: {
  visible: false
 }
};


var objs = [ 
    { name: 'item1', visible: false },
    { name: 'item2', visible: false },
    { name: 'item3', visible: false }
];

objs.forEach(obj => {
  const property = myObject[obj.name];
  if (property) {
    obj.visible = property.visible;
  }
});


console.log(objs);

【讨论】:

  • a forEach 会更好,因为您不修改 obj 或至少不想修改
【解决方案2】:

循环您的myObject,并使用findobjs 中找到对象,然后设置找到的对象的值:

for (let o in myObject) {
  let obj = objs.find(i => i.name == o)
  if(!obj) continue
  obj.visible = myObject[o].visible
}

这是一个工作示例:

const myObject = {
 item1: {
  visible: true
 },
 item2: {
  visible: true
 },
 item3: {
  visible: false
 }
}

var objs = [ 
    { name: 'item1', visible: false },
    { name: 'item2', visible: false },
    { name: 'item3', visible: false }
]

for (let o in myObject) {
  let obj = objs.find(i => i.name == o)
  if(!obj) continue
  obj.visible = myObject[o].visible
}

console.log(objs)

【讨论】:

  • 对不起,我可能读错了,但您不是在更改对象中的值吗?不是数组?
  • 我按照你想要的相反方式做了,看看我的编辑应该可以解决它。
【解决方案3】:

const myObject = {
 item1: {
  visible: true
 },
 item2: {
  visible: true
 },
 item3: {
  visible: false
 }
};


var objs = [ 
    { name: 'item1', visible: false },
    { name: 'item2', visible: false },
    { name: 'item3', visible: false }
];

Object.getOwnPropertyNames(myObject).forEach(propertyName => {
  let obj = objs.find(o => o.name === propertyName);
  if (obj) {
    obj.visible = myObject[propertyName].visible;
  }
});

console.log(objs);

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 2022-11-14
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多