什么是相当于_.勇气的物体

What is the object equivalent of _.pluck

本文关键字:勇气 相当于 什么      更新时间:2023-09-26

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

基本上,我想要的是一个处理对象并返回一个对象而不是数组(及其关联键)的_.pull版本。

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

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的每个循环编写了一个快速版本,因为我对jQuery比下划线(包含在下面)更熟悉,但如果可能的话,我更喜欢使用库中的一个。

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

在下划线中没有完全这样做的方法1.4.4,但如果您想保留在下划线中,可以执行

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

由bfavaretto 提供的jsfiddle演示


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

更新的演示

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

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

请注意,这在较旧的javascript引擎上不起作用,但在node.js0.12和--harmony中效果很好,或者在node.js4.x及更高版本中也很好。我刚刚在Chrome 46中测试了这个,它运行良好。

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

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

lodash参考:_.map值

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

您不需要第三方库来获得像这样简单的东西

// 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)

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

如果给mapObject一个字符串而不是函数,它会将其解释为属性名称,并表现为"pluckObject"。大多数职能部门在接受什么方面都出奇地自由。

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

如果你想要一个明确的函数,你可以看看_.pluck是如何实现的,并编写自己的类似版本:

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

这有点多余,但它会让你的意图更加清晰。

您可以使用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实现会更快。

JSLint建议使用obj.hasOwnProperty(name)检查。