javascript One-liner per prendere alcune proprietà dall'oggetto in ES 6



3 Answers

Non penso che ci sia un modo per renderlo molto più compatto della tua risposta (o di Torazburo), ma in sostanza quello che stai cercando di fare è emulare l'operazione di pick di Underscore . Sarebbe stato abbastanza semplice reimplementarlo in ES6:

function pick(o, ...fields) {
    return fields.reduce((a, x) => {
        if(o.hasOwnProperty(x)) a[x] = o[x];
        return a;
    }, {});
}

Allora hai una comoda funzione riutilizzabile:

var stuff = { name: 'Thing', color: 'blue', age: 17 };
var picked = pick(stuff, 'name', 'age');
javascript ecmascript-6 ecmascript-harmony destructuring ecmascript-next

Come si può scrivere una funzione, che richiede solo pochi attributi in modo più compatto in ES6?

Ho trovato la soluzione usando destrutturazione + oggetto semplificato letterale, ma non mi piace che l'elenco dei campi sia ripetuto nel codice.

C'è una soluzione ancora più sottile?

(v) => {
    let { id, title } = v;
    return { id, title };
}






Ho una soluzione simile a quella di Ethan Brown, ma ancora più corta. Un'altra funzione pick2 è un po 'più lunga (e più lenta), ma consente di rinominare le proprietà in modo simile a ES6.

const pick = (o, ...props) => props.reduce((r, p) => p in o ? {...r, [p]: o[p]} : r, {})

const pick2 = (o, ...props) => props.reduce((r, expr) => {
  const [p, np] = expr.split(":").map( e => e.trim() )
  return p in o ? {...r, [np || p]: o[p]} : r
}, {}) 

Ecco l'esempio di utilizzo:

const d = { a: "1", c: "2" }

console.log(pick(d, "a", "b", "c"))        // -> { a: "1", c: "2" }
console.log(pick2(d, "a: x", "b: y", "c")) // -> { x: "1", c: "2" }





Related