函数式编程-从Javascript中的对象列表中提取对象属性

functional programming - Extract object attribute from list of objects in Javascript

本文关键字:列表 对象 提取 取对象 属性 函数 编程 Javascript      更新时间:2023-09-26

我从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']

我正在尝试以一种功能性的方式完成它(我使用下划线.js),但我无法找到实现它的方法

types = [];
_.each(response, function(arr1, key1) {
    _.each(arr1, function(arr2, key2) {
        types.push(arr2.type);
    });
});
types = _.uniq(types);

但这太难看了。你能帮我找出一种更好的写代码的方法吗?

谢谢!

这应该有效:

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

Fiddle:http://jsfiddle.net/NFSfs/

当然,如果你想的话,你可以删除所有空白:

types = _.chain(input).values().flatten().pluck("type").uniq().value()

或无链接:

types = _.uniq(_.pluck(_.flatten(_.values(input)),"type"));

flatten似乎对对象有效,尽管文档明确指出不应该这样做。如果您希望针对实现进行编码,可以省略对values的调用,但我不建议这样做。总有一天,实现可能会发生变化,让您的代码神秘地崩溃。

如果您只想要较短的代码,可以将对象展平为单个数组,然后映射该数组。

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"))