9

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

基本上,我想要的是 _.pluck 的一个版本,它与对象一起工作并返回一个对象而不是一个数组(及其关联的键)。

因此,例如,如果我有这样的对象:

elements: {
    steam: {
        temperature: 100,
        color: 'orange',
        state: 'gas'
    },
    water: {
        temperature: 50,
        color: 'blue',
        state: 'liquid'
    },
    ice: {
        temperature: 0,
        color: 'white',
        state: 'solid'
    }
}

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

让它回来

{
    steam: 100,
    water: 50,
    ice: 0
}

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

[100, 50, 0]

这种转换叫什么?它是否已经包含在下划线中?我自己用 jQuery 的 each 循环编写了一个快速版本,因为我比下划线(包括在下面)更熟悉 jQuery,但如果可能的话,我更喜欢使用库中的一个。

$.objPluck = function(obj, key) {
    var ret = {};
    $.each(obj, function(k, value) {
        ret[k] = value[key];
    });
    return ret;
}
4

6 回答 6

10

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

_.object(_.keys(elements), _.pluck(elements, 'temperature'))

jsfiddle 的演示由bfavaretto提供


从下划线1.8.3开始,这可以用_.mapObject(elements, 'temperature');.

更新的演示

于 2013-08-13T21:00:15.270 回答
7

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

Object.keys(elements).map(f=>elements[f].temperature)

请注意,这不适用于较旧的 javascript 引擎,但在 node.js 0.12 中--harmony效果很好,或者在 node.js 4.x 及更高版本中也可以。我刚刚在 Chrome 46 中测试了它,它工作正常。

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

于 2015-11-06T18:03:53.677 回答
3

在 lodash(类似于下划线)上,您可以使用_.mapValues(elements,'temperature').
它的回报{steam: 100, water: 50, ice: 0}

lodash 参考: _. mapValues

顺便说一句,您可以_.mapKeys在一行中使用构建对象哈希
_.mapKeys(elements,'color') //{orange: Object, blue: Object, white: Object}

于 2015-05-26T16:08:06.070 回答
1

你不需要 3rd 方库来做这样简单的事情

// with a plain old for loop
const temps = {}
for (let key in data["elements"]) {
    dikt[key] = temps["elements"][key]["temperature"]
}
return temps

// with a reduce

Object.keys(data['elements']).reduce((acc, key) => acc[key] = data['elements'][key]['temperature'] , temps)
于 2018-04-13T15:22:21.307 回答
0

您可以使用JavaScript for-in 循环来遍历对象的键:

var list = [];

// Iterate through each object key, and pick wanted the values.
for(var name in obj)
{
    if (obj.hasOwnProperty(name) && name === "temperature")
    {
       list.push(obj[name]);
    }
}

以上是一个简化的示例,但您应该能够轻松修改以将其封装在更通用的函数中。此外,您实际上并不需要在这里使用 JQuery - 本机 JavaScript 实现会更快。

JSLintobj.hasOwnProperty(name)建议进行检查

于 2013-08-13T21:00:22.393 回答
0

在较新的版本中,实际上有一个内置函数可以做到这一点。

如果你给 一个字符串,而不是一个函数,mapObject它会将它解释为一个属性名称并表现为一个“ pluckObject”。大多数函数在接受的内容上都出奇地自由。

> _.mapObject(elements,'temperature')
Object {steam: 100, water: 50, ice: 0}

如果您想要一个明确的功能,您可以查看如何_.pluck实现编写您自己的类似版本:

_.mixin({
  pluckObject: function(obj, key) {
    return _.mapObject(obj, _.property(key));
  }
});

这有点多余,但它使您的意图更加清晰。

于 2015-11-09T03:30:18.757 回答