【问题标题】:Delete object element with forEach()使用 forEach() 删除对象元素
【发布时间】:2018-03-18 23:17:10
【问题描述】:

我有这段代码可以从对象中删除元素:

const data = {
    "fname": "xyz",
    "lname": "abc",
    "age": 23,
    "level_year": 555,
    "qty_min": 1,
    "qty_med": 2
};

['fname', 'age'].forEach(val => {
    console.log('??', val)
    delete data[val];
});

console.log('result', data);

输出:

[object Object] {
  level_year: 555,
  lname: "abc",
  qty_med: 2,
  qty_min: 1
}

我实际上想使用相同的key 删除所有元素,所以我这样做了:

const data = {
    "fname": "xyz",
    "lname": "abc",
    "age": 23,
    "level_year": 555,
    "qty_min": 1,
    "qty_med": 2
};

const obj1 = Object.assign({}, data);
const obj2 = Object.assign({}, data);

['fname', 'age'].forEach(val => {
    console.log('??', val)
    delete obj1[val];
    delete obj2[!val];
});

console.log('result1', obj1);
console.log('result2', obj2);

更新:我添加了delete obj2[!val],因为我希望obj2 只保留fname 和age 元素。显然我错了。 obj2 的预期输出:

[object Object] {
  "fname": "xyz",
  "age": 23,
} 

obj1 确实删除了该元素,但 obj2 没有。如何在不使用多个 forEach() 和使用相同的对象键的情况下解决此问题?最好没有图书馆。提前致谢。

【问题讨论】:

  • obj2[!val] ----- > ! ....... ???????????
  • 你认为!val 会是什么,比如val == 'fname' 是什么时候? (提示:这是错误的)
  • @sg552 : obj2[!val] ==> obj2[false](因为非空字符串是真实值)==> undefined

标签: javascript object foreach


【解决方案1】:

这里是演示,

const data = {
    "fname": "xyz",
    "lname": "abc",
    "age": 23,
    "level_year": 555,
    "qty_min": 1,
    "qty_med": 2
};

const obj1 = Object.assign({}, data);
const obj2 = Object.assign({}, data);

Object.keys(data).forEach(val => {
    /*console.log('??', val)*/
    if (['fname', 'age'].indexOf(val) > -1) {
        delete obj1[val];
    }
    else {
        delete obj2[val];
    }
});

console.log('result1', obj1);
console.log('result2', obj2);

【讨论】:

  • 明白你的意思..你想删除与 obj1 相同的 2 对吗?
  • 你的答案是正确的。我很感激你的帮助。谢谢。
【解决方案2】:

看到预期的结果,您可以只将属性添加到想要的对象,而不是完全克隆数据两次并删除属性:

const data = {
    "fname": "xyz",
    "lname": "abc",
    "age": 23,
    "level_year": 555,
    "qty_min": 1,
    "qty_med": 2
};

const obj1 ={},obj2 ={}, props = new Set(['fname', 'age']);
Object.keys(data).forEach(p=> (props.has(p) ? obj2 : obj1)[p] = data[p]);

console.log('result1', obj1);
console.log('result2', obj2);

编辑 关于行(props.has(p) ? obj2 : obj1)[p] = data[p]:

第一部分(props.has(p) ? obj2 : obj1)检查props-Sethas是否是名为p的属性。如果是,则此 sn-p 返回obj2,否则返回obj1

在该结果对象上,属性索引[p] 用于设置值。例如,对于fname,上面部分会返回obj2,结果是obj2[p] = ...

最后一部分data[p] 只是简单地获取data 对象上属性p 的值。

【讨论】:

  • 你没看错。 lname 是一个错字。我很抱歉。
  • 刚刚注意到您更改了帖子并从我的帖子中删除了问题。有点假设这是一个错字;)
  • 感谢您的帮助。
  • 当然在帖子里加了。这确实可能有点令人生畏。主要部分是条件运算符(props.has(p) ? obj2 : obj1)。对于fname,该行将解析为obj2['fname'] = data['fname']
  • 哎呀,轮到我打错字了。我以lname 开头的示例,但将其修改为fname 以匹配您上面的评论。
【解决方案3】:

您可以考虑创建没有这些属性的新对象并保持原样不变。

function omit(names, obj) {
  var result = {};
  for (var prop in obj) {
    if (names.indexOf(prop) == -1) {
      result[prop] = obj[prop];
    }
  }
  return result;
}

and use it like
const data = { "fname": "xyz", "lname": "abc", "age": 23, "level_year": 555, "qty_min": 1, "qty_med": 2 };
const withoutProps = omit(['fname', 'age'], data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-17
    • 2012-12-27
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2016-08-05
    相关资源
    最近更新 更多