把一个对象变成一个单键对象数组(带下划线?)
Turn an object into an array of single-key objects (with underscore?)
我有一个这样的对象:var o = { foo:"foo", bar:"bar" }
我想要这样的输出:[ { foo:"foo" }, { bar:"bar" } ]
我希望代码简洁,通常下划线可以做到这一点。我已经走到这一步了...
_.map(_.pairs(o), function(pair) { return { pair[0] : pair[1] }; });
但是我当然不能使用已计算的表达式作为该代码中的键。我觉得我可以做到...
_.map(_.pairs(o), function(pair) {
var kv = {};
kv[pair[0]] = pair[1];
return kv;
});
但我希望简明扼要。而事实并非如此。似乎有一个简单的单线,我太笨了,看不到。有吗?
PS - 我想要这个是因为我想把对象变成一个 mongo 查询析取,像这样:
{ $or: [ { foo:"foo" }, { bar:"bar" } ] }
Working example
您可能应该为此使用 _.mapObject
:
var a = _.mapObject(o, function(val, key) {
return {val: key};
});
然后你可以将它包装在一个数组中:
var final = [a]
如果您将 pair[0]
更改为 [pair[0]]
,您的 oneliner 在 ES6 中工作:
_.map( _.pairs( o ), pair => ( { [pair[0]] : pair[1] } ) );
你也可以在 ES6 中不使用下划线,像这样:
Object.keys( o ).map( key => ( { [key]: o[key] } ) );
或带下划线的略短:
_.keys( o ).map( key => ( { [key]: o[key] } ) );
或:
_.map( o, (value, key) => ( { [key]: value } ) ) );
我有一个这样的对象:var o = { foo:"foo", bar:"bar" }
我想要这样的输出:[ { foo:"foo" }, { bar:"bar" } ]
我希望代码简洁,通常下划线可以做到这一点。我已经走到这一步了...
_.map(_.pairs(o), function(pair) { return { pair[0] : pair[1] }; });
但是我当然不能使用已计算的表达式作为该代码中的键。我觉得我可以做到...
_.map(_.pairs(o), function(pair) {
var kv = {};
kv[pair[0]] = pair[1];
return kv;
});
但我希望简明扼要。而事实并非如此。似乎有一个简单的单线,我太笨了,看不到。有吗?
PS - 我想要这个是因为我想把对象变成一个 mongo 查询析取,像这样:
{ $or: [ { foo:"foo" }, { bar:"bar" } ] }
Working example
您可能应该为此使用 _.mapObject
:
var a = _.mapObject(o, function(val, key) {
return {val: key};
});
然后你可以将它包装在一个数组中:
var final = [a]
如果您将 pair[0]
更改为 [pair[0]]
,您的 oneliner 在 ES6 中工作:
_.map( _.pairs( o ), pair => ( { [pair[0]] : pair[1] } ) );
你也可以在 ES6 中不使用下划线,像这样:
Object.keys( o ).map( key => ( { [key]: o[key] } ) );
或带下划线的略短:
_.keys( o ).map( key => ( { [key]: o[key] } ) );
或:
_.map( o, (value, key) => ( { [key]: value } ) ) );