什么是相当于_.勇气的物体
What is the object equivalent of _.pluck
我已经重新实现了我自己的版本,但我怀疑这已经包含在下划线中了,因为它非常简单,而且与许多其他函数密切相关。但我想不出它应该叫什么名字。
基本上,我想要的是一个处理对象并返回一个对象而不是数组(及其关联键)的_.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)
检查。
- es6 相当于下划线查找位置
- 什么's是相当于LINQ's SelectMany运算符
- JavaScript相当于Smalltalk开发周期
- UWP webView相当于Android中的addJavascriptInterface()
- 相当于 ServiceWorker 中的 SharedWorker 端口
- Javascript:相当于PHP'使用RAW二进制输出的s hash_hmac.()
- 页面对象设计:有没有相当于Ruby gem的Javascript;site_prism”;
- 相当于bcpowmod的javascript
- 相当于Ruby中的pull和uniq的Javascript
- python相当于Meteoserver、Derbyjs或Angularjs
- PHP 相当于 Coldfusion 的 cfpdfform
- 相当于 Jquery/Backbone.js 中的 Dgrid/Store (Dojo 工具包)
- Sidr.js相当于没有jQuery的AngularJS
- 相当于pyinstaller,用于冻结python、html和javascript
- 纯Javascript:相当于jQuery$.data('key',value)
- 相当于StringEscapeUtils.escape java的Javascript
- 在Express.js中,是否有一个相当于res.locals的路由
- 相当于Python's values()字典方法
- 什么's相当于AngularJS中的jQuery.one()
- 什么是相当于_.勇气的物体