我从API接收到以下对象:
{
'2012-12-12': [
{ 'id': 1234,
'type': 'A' },
{ 'id': 1235,
'type': 'A' },
{ 'id': 1236,
'type': 'B' },
],
'2012-12-13': [
{ 'id': 1237,
'type': 'A' },
{ 'id': 1238,
'type': 'C' },
{ 'id': 1239,
'type': 'B' },
]
}
然后我想要另一个名为types
的类型为Array
的变量,该变量将保存每个对象的type
属性的每个可能值。在这种情况下,它将是:
types = ['A', 'B', 'C']
我正在尝试以功能方式完成它(我正在使用underscore.js),但我无法找到一种方法。现在我正在使用
types = [];
_.each(response, function(arr1, key1) {
_.each(arr1, function(arr2, key2) {
types.push(arr2.type);
});
});
types = _.uniq(types);
但那非常难看。你能帮我找出更好的编写代码的方法吗?
谢谢!
答案 0 :(得分:5)
这应该有效:
types = _.chain(input) // enable chaining
.values() // object to array
.flatten() // 2D array to 1D array
.pluck("type") // pick one property from each element
.uniq() // only the unique values
.value() // get an unwrapped array
小提琴:http://jsfiddle.net/NFSfs/
当然,如果您愿意,可以删除所有空格:
types = _.chain(input).values().flatten().pluck("type").uniq().value()
或没有链接:
types = _.uniq(_.pluck(_.flatten(_.values(input)),"type"));
flatten seems to work on objects,即使是the documentation clearly states it shouldn't。如果您希望针对实施进行编码,可以忽略对values
的调用,但我不建议这样做。实施可能会在一天内发生变化,使您的代码神秘地破裂。
答案 1 :(得分:1)
如果您只想要更短的代码,可以将对象展平为单个数组,然后映射该数组。
var types = _.unique(_.map(_.flatten(_.toArray(response)), function(arr) {
return arr.type;
}));
这是另一个版本。主要是为了好奇。
var types = _.unique(_.pluck(_.reduce(response, _.bind(Function.apply, [].concat), []), "type"));
这是另一个。
var types = _.unique(_.reduce(response, function(acc, arr) {
return acc.concat(_.pluck(arr,"type"));
}, []));
另一个。
var types = _.unique(_.pluck([].concat.apply([], _.toArray(response)), "type"))