Один лайнер, чтобы взять некоторые свойства из объекта в ES 6
как можно написать функцию, которая принимает только несколько атрибутов самым компактным образом в ES6?
Я придумал решение, используя деконструкцию + упрощенный литерал объекта, но мне не нравится, что список полей повторяется в коде.
есть еще более тонкое решение?
(v) => {
let { id, title } = v;
return { id, title };
}
7 ответов:
вот что-то более тонкое, хотя это не позволяет избежать повторения списка полей. Он использует "деструктурирование параметров", чтобы избежать необходимости в
Я не думаю, что есть какой-либо способ сделать его гораздо более компактным, чем ваш ответ (или торазбуро), но по существу то, что вы пытаетесь сделать, это эмулировать библиотеки Underscore!--2--> операция. Было бы достаточно легко повторно реализовать это в ES6:
function pick(o, ...fields) { return fields.reduce((a, x) => { if(o.hasOwnProperty(x)) a[x] = o[x]; return a; }, {}); }
тогда у вас есть удобная функция повторного использования:
var stuff = { name: 'Thing', color: 'blue', age: 17 }; var picked = pick(stuff, 'name', 'age');
трюк для решения этого как однострочный заключается в том, чтобы перевернуть принятый подход: Вместо того, чтобы начинать с исходного объекта
orig
, можно начать с ключей, которые они хотят извлечь.используя
Array#reduce
затем можно хранить каждый необходимый ключ на пустом объекте, который передается какinitialValue
для указанной функции.вот так:
const orig = { id: 123456789, name: 'test', description: '…', url: 'https://…', }; const filtered = ['id', 'name'].reduce((result, key) => { result[key] = orig[key]; return result; }, {}); console.log(filtered); // Object {id: 123456789, name: "test"}
чуть более короткое решение с помощью оператора запятой:
const pick = (O, ...K) => K.reduce((o, k) => (o[k]=O[k], o), {})
TC39 объект rest / spread свойства предложение сделает это довольно гладко:
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 }; z; // { a: 3, b: 4 }
(у него есть обратная сторона создания
x
иy
переменные, которые вам могут не понадобиться.)
я требовал этого решения, но я не знал, если предлагаемые ключи были доступны. Итак, я взял @torazaburo ответ и улучшил для моего случая использования:
function pick(o, ...props) { return Object.assign({}, ...props.map(prop => { if (o[prop]) return {[prop]: o[prop]}; })); } // Example: var person = { name: 'John', age: 29 }; var myObj = pick(person, 'name', 'sex'); // { name: 'John' }