我想在不更改对象的情况下过滤对象的属性。
let myObject = {
propA: [1,2,3],
propB: "foo"
}
现在我想做类似的事情:
myObject.propA.filter(el => el === 2)
但这只会返回过滤后的数组,我不得不写
myObject.propA = myObject.propA.filter(el => el === 2)
以更改我的对象。
但是那不是我想要的!我想生成一个新的过滤对象,而不会使旧对象发生变化。 有人可以帮我吗?
答案 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);