什么是_.pluck的等效对象

Bra*_*yer 8 javascript transformation object underscore.js

我已经重新实现了我自己需要的版本,但我怀疑它已经包含在下划线中,因为它非常简单并且与许多其他函数密切相关.但我想不出应该叫什么.

基本上,我想要的是_.pluck的一个版本,它使用对象并返回一个对象而不是一个数组(及其相关的键).

所以,例如,如果我有一个像这样的对象:

elements: {
    steam: {
        temperature: 100,
        color: 'orange',
        state: 'gas'
    },
    water: {
        temperature: 50,
        color: 'blue',
        state: 'liquid'
    },
    ice: {
        temperature: 0,
        color: 'white',
        state: 'solid'
    }
}
Run Code Online (Sandbox Code Playgroud)

我想打个电话 _.something(elements, 'temperature')

让它回归

{
    steam: 100,
    water: 50,
    ice: 0
}
Run Code Online (Sandbox Code Playgroud)

而不是_.pluck(elements, 'temperature')返回

[100, 50, 0]
Run Code Online (Sandbox Code Playgroud)

这个转变叫做什么,它是否已经包含在下划线中?我自己用jQuery的每个循环编写了一个快速版本,因为我比jQuery更熟悉jQuery而不是下划线(如下所示),但如果可能的话,我更喜欢使用库中的一个.

$.objPluck = function(obj, key) {
    var ret = {};
    $.each(obj, function(k, value) {
        ret[k] = value[key];
    });
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ics 9

在下划线1.4.4中没有办法完全做到这一点,但如果你想留在下划线,你可以做到

_.object(_.keys(elements), _.pluck(elements, 'temperature'))
Run Code Online (Sandbox Code Playgroud)

演示在的jsfiddle的礼貌bfavaretto


从下划线1.8.3开始,这可以简洁地完成_.mapObject(elements, 'temperature');.

更新的演示

  • 我打算发布完全相同的代码.这里有一个jsfiddle来演示它:http://jsfiddle.net/PfZwx/ (2认同)

tax*_*ian 5

值得在这里添加一个使用ES6箭头功能等的解决方案:

Object.keys(elements).map(f=>elements[f].temperature)
Run Code Online (Sandbox Code Playgroud)

请注意,这不适用于较旧的javascript引擎,但在node.js 0.12中--harmony它可以很好地工作,或者与node.js 4.x及更高版本一起工作.我刚刚在Chrome 46中对此进行了测试,它运行正常.

它的优点是不需要任何额外的库,如下划线或lodash,但当然只适用于新的JS引擎.