Фильтровать свойство массива объекта, не изменяя сам объект - PullRequest
0 голосов
/ 11 декабря 2018

Я бы хотел отфильтровать свойство объекта без изменения объекта.

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

Теперь я хотел бы сделать что-то вроде:

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

Но это только возвращает отфильтрованный массив, и мне нужно было бы написать

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

вчтобы изменить мой объект.

Но это совсем не то, что я хочу!Я хотел бы создать новый отфильтрованный объект без изменения старого.Может ли кто-нибудь помочь мне?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Вы также можете клонировать объект и изменять только свойство нового объекта.

let myObject = {
    propA: [1,2,3],
    propB: "foo"
}
let newObject = Object.create(myObject);
newObject.propA = myObject.propA.filter(el=> el ===2);
0 голосов
/ 11 декабря 2018

Вы можете написать 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" }
  )
0 голосов
/ 11 декабря 2018

Вы можете 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...