使用forEach()删除对象元素

时间:2017-10-07 07:24:16

标签: javascript object foreach

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

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仅保留fnameage元素。显然我错了。 obj2的预期输出:

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

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

3 个答案:

答案 0 :(得分:3)

查看预期结果,而不是将数据完全克隆两次并在之后删除属性,您只能将属性添加到所需对象:



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)检查道具 - Set has是否属于p。如果是,则此代码段会返回obj2,否则会返回obj1

在该结果对象上,属性索引[p]用于设置值。例如,对于fnameobj2将从上面的部分返回,从而产生obj2[p] = ...

最后一部分data[p]只是为了在p对象上获取属性data的值。

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

答案 2 :(得分:1)

您可以考虑创建没有这些属性的新对象,并保持原始状态。

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)