动态传递键以映射到新对象

时间:2017-08-04 21:37:55

标签: javascript ecmascript-6

对于令人困惑的标题感到抱歉,我不确定如何在单行中描述这一点。

我有以下效用函数:

module.exports.reduceObject = item => (({ price, suggested_price }) => ({ price, suggested_price }))(item);

valuesprice获取suggest_price并返回一个只包含这些键和值的新对象。

然后我可以像这样转动一个对象:

inspect_link: 'steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S76561198279893060A%item_id%D9567622191659726240',
price: '2.15',
suggested_price: '2.90',
is_featured: false,
float_value: '-1.00000',
pattern_info: 
 { paintindex: 0,
   paintseed: null,
   rarity: 3,
   quality: 4,
   paintwear: null },
is_mine: false,
tags: { type: 'Collectible', quality: 'Normal', rarity: 'High Grade' },
fraud_warnings: [],
stickers: null,
updated_at: 1501880427 }

进入它的简化版本:

{"price":"2.59","suggested_price":"1.41"}

然后我将其存储在MongoDB数据库中。

我希望能够动态传递密钥(例如pricesuggested_price,这样我就可以将任何对象缩减为自身的较小版本,但我可以我正在努力寻找一个好的实施方案。

我写了一些如:

module.exports.reduceObject = (item, keys) => (({ ...keys }) => ({ ...keys }))(item);

这不是有效的,但我真的不知道如何处理这个问题。

任何人都可以提供解决方案吗?

2 个答案:

答案 0 :(得分:1)

已经有一个强大的lodash库可以满足您的需求。它具有pick函数,该函数返回由拾取的对象属性组成的对象:

let newItem = _.pick(item, ['price', 'suggested_price']);

答案 1 :(得分:1)

我发现lodash的实现难以阅读。如果你像我一样,这里有一个更简单的实现:

function pick(object, keys) {
    const result = {};
    for (const key of keys) {
        if (object.hasOwnProperty(key)) {
            result[key] = object[key];
        }
    }
    return result;
}

根据您的使用情况,检查密钥是否实际位于源对象中非常重要。这让我失望了。