从数组中对象的数组中获取字符串值

时间:2018-10-31 08:49:10

标签: javascript json mapping

我有以下JSON对象:

var test = {
  data: [{
      itemID: 0,
      categories: [{
        id: 0,
        type: 'a',
        name: 'world'
      }, {
        id: 1,
        type: 'b',
        name: 'plants'
      }]
    },
    {
      itemID: 1,
      categories: [{
        id: 2,
        type: 'w',
        name: 'cars'
      }, {
        id: 3,
        type: 't',
        name: 'bicycles'
      }]
    }

  ]

};
console.log([].concat
.apply([],  test.data.map(item => item.categories.map(el => el.type))));

我想做的是获取数组中的所有类型。 因此结果应如下所示:

['a', 'b', 'w', 't']

我做了什么:

[].concat
.apply([],  test.data.map(item => item.categories.map(el => el.type)))

我觉得这可以轻松完成。

有人知道更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

您可以使用Array.prototype.map()Array.prototype.flat()

  

flat()方法将创建一个新数组,其中所有子数组元素都将递归地连接到其中,直到指定的深度为止。

深度可选

的位置
  

指定嵌套数组结构应展平的深度级别。默认为1。

var test = {
  data: [{
      itemID: 0,
      categories: [{
        id: 0,
        type: 'a',
        name: 'world'
      }, {
        id: 1,
        type: 'b',
        name: 'plants'
      }]
    },
    {
      itemID: 1,
      categories: [{
        id: 2,
        type: 'w',
        name: 'cars'
      }, {
        id: 3,
        type: 't',
        name: 'bicycles'
      }]
    }

  ]

};

var type = test.data.map(item => item.categories.map(el => el.type)).flat();
console.log(type);

答案 1 :(得分:2)

使用Array.reduce

var test = {data: [{itemID: 0,categories: [{id: 0,type: 'a',name: 'world'}, {id: 1,type: 'b',name: 'plants'}]},{itemID: 1,categories: [{id: 2,type: 'w',name: 'cars'}, {id: 3,type: 't',name: 'bicycles'}]}]};

let result = test.data.reduce((a,c) => a.concat(c.categories.map(v => v.type)), []);
console.log(result);