ecmascript 6 - Hvordan utelate spesifikke egenskaper fra et objekt i JavaScript


Finnes det en ryddig måte å returnere et nytt objekt som utelater visse egenskaper som det opprinnelige objektet inneholder uten å måtte bruke noe som lodash?

Svar #1

const { bar, baz, ...qux } = foo

Nå har objektet ditt qux alle egenskapene til foo bortsett fra bar og baz.

Svar #2

I moderne miljøer kan du bruke dette kodesnippet:

function omit(key, obj) {
  const { [key]: omitted, ...rest } = obj;
  return rest;
}

Svar #3

Hvis du kjenner listen over egenskapene du ønsker bevart samt utelatt, bør følgende «hvitelistings»-tilnærming fungere:

const exampleFilter = ({ keepMe, keepMeToo }) => ({ keepMe, keepMeToo })

console.log(
  exampleFilter({
    keepMe: 'keepMe',
    keepMeToo: 'keepMeToo',
    omitMe: 'omitMe',
    omitMeToo: 'omitMeToo'
  })
)

Svar #4

Det finnes blacklist-pakken på npm som har et veldig fleksibelt API.

Også et situasjonelt triks som bruker objektets rest-spread-forslag (fase 3).

const {a, b, ...rest} = {a: 1, b: 2, c: 3, d: 4};
a // 1
b // 2
rest // {c: 3, d: 4}

Dette brukes ofte i React-komponenter der du vil bruke noen få egenskaper og sende resten som props til en <div {...props} /> eller lignende.

Svar #5

En løsning som ennå ikke har blitt nevnt:

Utelat enkelt

o = {a: 5, b: 6, c: 7}
Object.fromEntries(Object.entries(o).filter(e => e[0] != 'b'))
// Object { a: 5, c: 7 }

Utelat flere

o = {a: 1, b: 2, c: 3, d: 4}
exclude = new Set(['a', 'b'])
Object.fromEntries(Object.entries(o).filter(e => !exclude.has(e[0])))
// Object { c: 3, d: 4 }

Settet Set ovenfor brukes fordi det fører til lineær-logaritmisk kompleksitet selv om antallet elementer i exclude er i den samme asymptotiske ekvivalensklassen som antallet elementer i o.

Svar #6

Utelat et array av nøkler, bruk ES7 med rekursjon.

function omit(keys, obj) {
  if (!keys.length) return obj
  const { [keys.pop()]: omitted, ...rest } = obj;
  return omit(keys, rest);
}

Dette bygger videre på svaret til @Eddie Cooro.

Relaterte artikler