如果值为true,则从循环中删除项

时间:2018-01-29 22:33:06

标签: javascript ecmascript-6

我是javascript的新手并循环显示完整列表的列表,但如果object属性的属性设置为true,我不想显示它。由于popdelete不起作用,我无法弄清楚循环内容是什么。

for (const user of users) {
                user.name = `${user.firstname}`;
                if (user.disabled === true) {
                    /* not sure what to do here*/
                }
            }

3 个答案:

答案 0 :(得分:3)

您想要filtermap个新对象(添加新属性name)。 但是,不是在数组上循环两次,而是可以使用.reduce在同一次迭代中过滤和映射对象。

运行示例:



const users = [
  {firstName: 'john', disabled: false},
  {firstName: 'jane', disabled: true},
  {firstName: 'moe', disabled: false},
  {firstName: 'doe', disabled: true},
];

const nextUsers = users.reduce((result, current) => {
  if(!current.disabled){
    result.push({
      ...current,
      name: current.firstName
    });
  }
  return result;
},[]);

console.log(nextUsers);




答案 1 :(得分:2)

根据您在代码中显示的内容,我假设您拥有一组至少包含属性namefirstNamedisabled的用户。 您可以使用ES6完全支持的方法filter,以便从阵列中删除不符合您要检查的属性的对象。 为此,您使用方法filter循环数组,检查属性disabled是否为false

const users = [
  {
     name: "Name1",
     firstName: "firstName1",
     disabled: true,
  },{
     name: "Name2",
     firstName: "firstName2",
     disabled: false,
  },
];

const usersFiltered = users.filter(user => !user.disabled);

console.log(usersFiltered);

注意:如果没有填充,这将无法在IE 8或更低版本中使用。

答案 2 :(得分:-1)

如果您想要更高效的方式,可以使用Array.prototype.reduce

以单向方式执行这两项操作
const filteredUsers = users.reduce((newUsersArray, user) => {
  user.name = `${user.firstName}`
  if (!user.disabled) {
    newUsersArray.push(user)
  }

  return newUsersArray
}, [])

由于users是一个数组,您可以使用

过滤掉它
users.filter(user => !user.disabled).forEach(user => user.name = user.firstName)

所以Array.prototype.filter是一种过滤你的数组的方法:如果迭代遍历数组内的每个对象的函数结果为false,它将不包括在结果数组中

Array.prototype.forEach遍历所有项目并允许更改每个项目。