把一个对象变成一个单键对象数组(带下划线?)

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] } ) );

JSFiddle

或带下划线的略短:

_.keys( o ).map( key => ( { [key]: o[key] } ) );

或:

_.map( o, (value, key) => ( { [key]: value } ) ) );