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

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

восстанавливает оригинальный хеш, поэтому практически невидим.

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

Вот что-то более тонкое, хотя это не мешает повторять список полей. Он использует «деструктуризацию параметров», чтобы избежать необходимости в параметре v.

({id, title}) => ({id, title})

underscore.string.js Object.assign и вычисляемые свойства ([p] часть):

function pick(o, ...props) {
    return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}

. Эта альтернатива медленнее, по причинам, указанным @snover. Но это также создало бы у других программистов впечатление, что configurable и методах получения и сеттеры, опуская при этом не перечислимые свойства, затем:

function pick(o, ...props) {
    var has = p => o.propertyIsEnumerable(p),
        get = p => Object.getOwnPropertyDescriptor(o, p);

    return Object.defineProperties({},
        Object.assign({}, ...props
            .filter(prop => has(prop))
            .map(prop => ({prop: get(props)})))
    );
}

Я не думаю, что есть какой-то способ сделать его намного более компактным, чем ваш ответ (или ответ торазбуро), но, по сути, вы пытаетесь эмулировать Модуль Underscore es6-обещания pick операция Это решение исправляет ошибку, вызванную попыткой запустить

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');

диаграмма выполнения Javascript для строгого равенства / сравнения ‘===’ 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), {})

В Javascript: Я начал с использования вики-ответа сообщества, но понял, что он не обнаруживает события alt-tab в Chrome, потому что он использует первый доступный источник событий, и в этом случае это API видимости страницы, который в Chrome, похоже, не отслеживает alt-tabbing.

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
z; // { a: 3, b: 4 }

(у него есть и обратная сторона создания x и y Дейв Метвин и

У меня есть аналог решения Итана Брауна, но даже короче — pick Как использовать переменные javascript в качестве параметра в селекторе jquery? pick2 Это действительно сложно. Похоже, не существует решения с учетом следующих требований.

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
}, {}) 

В вашем контроллере:

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

Можно было бы использовать destructuring чтобы назначить свойства пустому объекту.

let person = {
    fname:'tom',
    lname:'jerry',
    aage:100
}

let newPerson = {};

({fname: newPerson.fname, lname: newPerson.lname} = person);

console.log(newPerson);

есть новый синтаксис, я требовал этого решения, но я не знал, были ли предложенные ключи доступны. Итак, я взял ответ @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' }