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.
