从JavaScript对象的名单中提取对象属性(Extract object attribute f

2019-08-16 22:21发布

我有以下的对象,我从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);

但是,这是非常难看。 你能帮我搞清楚编写这些代码的更好的办法?

谢谢!

Answer 1:

这应该工作:

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

扁平化似乎对对象的工作 ,即使文件明确指出它不应该 。 如果您想对代码执行,你可以离开了调用values ,但我不建议。 实施可能会改变某一天,离开你的代码神秘打破。



Answer 2:

如果你只是想更短的代码,你可以扁平化的对象到一个数组,然后映射数组。

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


文章来源: Extract object attribute from list of objects in Javascript