Вот что-то более тонкое, хотя это не мешает повторять список полей. Он использует «деструктуризацию параметров», чтобы избежать необходимости в v
параметре.
({id, title}) => ({id, title})
(См. Работающий пример в этом другом ответе ).
Решение @ EthanBrown носит более общий характер. Вот более идиоматическая версия, которая использует Object.assign
и вычисляемые свойства ( [p]
часть):
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}
Если мы хотим сохранить атрибуты свойств, такие как 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)})))
);
}
Object.assign
; es6 похожа на рождественскую елку с таким количеством подарков, я все еще нахожу подарки спустя месяцы после праздникаfilter(...).map(prop => ({[prop]: get(prop)})))
?pick()
реализации вы также можете сделать что-то вродеreturn props.reduce((r, prop) => (r[prop] = o[prop], r), {})
undefined
. Иногда это важно. Кроме этого, хорошая идея.Я не думаю , что есть какой - нибудь способ сделать это гораздо более компактным , чем ваш ответ (или torazburo), но в основном то , что вы пытаетесь сделать , это эмулировать Underscore в
pick
эксплуатации . Было бы достаточно легко реализовать это в ES6:Тогда у вас есть удобная функция многократного использования:
источник
pick
функцию один раз, и вы можете выбрать столько свойств, сколько захотите, и они не удвоятся.hasOwnProperty
? Если поля выбраны вручную, дажеin
кажется более подходящим; хотя я бы пошел, чтобы полностью пропустить проверку и просто позволить им по умолчаниюundefined
.Хитрость для решения этой проблемы как однострочной заключается в том, чтобы изменить принятый подход: вместо того, чтобы начинать с исходного объекта
orig
, можно начать с ключей, которые они хотят извлечь.С помощью
Array#reduce
one может затем сохранить каждый необходимый ключ на пустом объекте, который передается какinitialValue
для указанной функции.Вот так:
источник
Немного более короткое решение с использованием оператора запятой:
источник
pick
функции в этой теме:pick({ name: 'John', age: 29, height: 198 }, 'name', 'age')
Предложение свойств оставшихся / распространенных объектов TC39 сделает это довольно привлекательным:
(Это имеет оборотную сторону создания
x
иy
переменные , которые вы , возможно , не нужны.)источник
omit
, но неpick
let { a, b } as z = { x: 1, y: 2, a: 3, b: 4 }
Вы можете использовать деструктуризацию объектов, чтобы распаковать свойства из существующего объекта и назначить их переменным с разными именами - полям нового, изначально пустого объекта.
источник
ES6 была последней спецификацией на момент написания вопроса. Как объясняется в этом ответе , выбор ключей в ES2019 значительно короче, чем в ES6:
источник
В настоящее время существует специальное предложение по улучшению синтаксиса сокращений объектов JavaScript, который позволит «выбирать» именованные свойства без повторения:
К сожалению, предложение, похоже, никуда не денется в ближайшее время. Последний раз редактировалось в июле 2017 года, а черновик на стадии 0 , предполагая, что автор, возможно, отказался от него или забыл об этом.
ES5 и более ранние (не строгий режим)
Самая краткая возможная стенограмма, которую я могу придумать, включает в себя функцию древнего языка, которую больше никто не использует:
with
операторы запрещены в строгом режиме, что делает этот подход бесполезным для 99,999% современного JavaScript. Немного обидно, потому что это единственное наполовину приличное использование, которое я нашел для этойwith
функции. 😀источник
У меня есть аналогичное решение Итана Брауна, но еще короче -
pick
функция. Другая функцияpick2
немного длиннее (и медленнее), но позволяет переименовывать свойства аналогично ES6.Вот пример использования:
источник
Мне требовалось это решение, но я не знал, были ли предложенные ключи доступны. Итак, я взял ответ @torazaburo и улучшил для моего случая использования:
источник
вдохновлен сокращенным подходом https://stackoverflow.com/users/865693/shesek :
использование:
pick({ model : 'F40', manufacturer: 'Ferrari', productionYear: 1987 }, 'model', 'productionYear')
результаты в:{model: "F40", productionYear: 1987}
источник