将对象转换为单键对象数组(带下划线?)

时间:2016-04-29 22:24:53

标签: javascript mongodb underscore.js

我有一个这样的对象: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" } ] }

2 个答案:

答案 0 :(得分:2)

如果您将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 } ) ) );

答案 1 :(得分:1)

Working example 您可能应该使用 $rootScope.listCounter = $firebaseArray(allLists);

_.mapObject

然后你可以把它包装在一个数组中:

var a = _.mapObject(o, function(val, key) {
  return {val: key};
});