Один лайнер, чтобы взять некоторые свойства из объекта в ES 6


как можно написать функцию, которая принимает только несколько атрибутов самым компактным образом в ES6?

Я придумал решение, используя деконструкцию + упрощенный литерал объекта, но мне не нравится, что список полей повторяется в коде.

есть еще более тонкое решение?

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

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' }