过滤对象的数组属性而无需更改对象本身

时间:2018-12-11 02:04:37

标签: javascript functional-programming

我想在不更改对象的情况下过滤对象的属性。

let myObject = {
    propA: [1,2,3],
    propB: "foo"
}

现在我想做类似的事情:

myObject.propA.filter(el => el === 2)

但这只会返回过滤后的数组,我不得不写

myObject.propA = myObject.propA.filter(el => el === 2)

以更改我的对象。

但是那不是我想要的!我想生成一个新的过滤对象,而不会使旧对象发生变化。 有人可以帮我吗?

3 个答案:

答案 0 :(得分:2)

您可以filter()数组,然后将其与原始对象合并以创建一个新的数组,而无需更改原始数组。像这样:

let myObject = {
    propA: [1,2,3],
    propB: "foo"
}
let propA = myObject.propA.filter(el => el === 2)
let newobj = {...myObject, propA}

// new Object
console.log("New:", newobj)

// old object unchanges
console.log("Old:", myObject)

答案 1 :(得分:1)

您可以使用解构分配和散布参数编写transform

const transform = ({ a = [], ...rest }) =>
  ({ a: a .filter (el => el === 2)
   , ...rest
   })

const myObject =
  { a: [ 1, 2, 3 ]
  , b: "foo"
  }
   
console .log
  ( transform (myObject)
    // { a: [ 2 ], b: "foo" }
    
  , transform ({ a: [ 1, 2, 1, 2, 1, 2 ], b: "bar", c: "cat" })
    // { a: [ 2, 2, 2 ], b: "bar", c: "cat" }
    
  , transform ({ y: "z" })
    // { a: [], y: "z" }
  )

答案 2 :(得分:0)

您还可以克隆对象并仅更改新对象的属性。

let myObject = {
    propA: [1,2,3],
    propB: "foo"
}
let newObject = Object.create(myObject);
newObject.propA = myObject.propA.filter(el=> el ===2);