如何使用对象解构散布运算符删除多个对象属性

时间:2019-04-18 09:40:25

标签: javascript ecmascript-6

我在我的化简Map / Associative数组中使用它来通过字符串ID存储对象。

当我需要Map中的新项目时,我正在使用此构造

rows: { ...state.rows, [row.id]: row }

当我需要通过ID删除项目表单映射时,我正在使用它。

const  { [rowId]: deleted, ...rows } = state.rows;

与变量行相比,我缺少名称为rowId的map和property。

我想知道如果数组中有多个ID,并且需要通过...运算符并进行销毁将其删除,该怎么办。

const contentIds = ['id1','id2','id3']

// something like ???
const {...[ids], ...rows} 

是的,我可以为此编写lamda或使用省略lodash。 但是,只要有可能,就很有趣。

非常感谢

3 个答案:

答案 0 :(得分:3)

您可以使用对象减少按键。

var object = { id: 1, id1: 2, id2: 3 },
    contentIds = ['id1', 'id2', 'id3'],
    result = contentIds.reduce((o, k) => ({ [k]: _, ...r } = o, r), object);

console.log(result);

答案 1 :(得分:0)

const myObj = { id1: 'test', id2: 'test', id3: 'test' }
const idsToFilter = ['id1', 'id2']
const { id1, id2, ...filtered } = myObj
console.log(filtered)

但是,除非您知道要从对象中过滤的确切ID,否则您将无法通过编程方式进行操作。如果您想基于一组ID来执行此操作,则需要使用类似的

function filterObjectByKeys (object, keysToFilter) {
  return Object.keys(object).reduce((accum, key) => {
    if (!keysToFilter.includes(key)) {
      return { ...accum, [key]: object[key] }
    } else {
      return accum
    }
  }, {})
}

答案 2 :(得分:0)

  

如果我在数组中有多个ID,而我却在徘徊,我该怎么办   需要通过...运算符删除它们并进行销毁。

不,您不能这样做,您可能会与restspread语法感到困惑,赋值左侧的...rest语法不是spread

Rest and Spread

并且rest语法要求...后跟变量名,您要尝试的是syntaxError

const object = {a:1,b:2,c:3}
const a = ['a','b']
const {...[a], ...rows} = object

console.log(rows)

更多,您不能在,之后使用rest中间逗号,即使这样做

let {...a, ...rows } = obj 

它仍然无效

const object = {a:1,b:2,c:3}

const {...a, ...rows} = object

console.log(rows)

您可以使用@nina建议的解决方案,也可以创建对象的副本并遍历contentIds并从copyObj中删除键/值以获得所需的值

const object = { id: 1, id1: 2, id2: 3 };
const contentIds = ['id1', 'id2', 'id3'];
const objCopy = object

contentIds.forEach(key=>{
  delete objCopy[key]
})

console.log(objCopy);