将数组转换为对象?

时间:2016-06-21 22:31:13

标签: javascript arrays json object ecmascript-6

我正在尝试将以下对象数组转换为包含label属性的对象,作为包含与该属性相同的键的多个对象数组的键。

这是一个映射数组的函数的JSBin,但我不确定我将使用的ES6逻辑来获得我想要的输出。

https://jsbin.com/foyijisaku/1/edit?js,console

原始数组

var originalArray =

    [
      {
        'id': 6,
        'label': 'hello'
      },
      {
        'id': 5,
        'label': 'hello'
      },
      {
        'id': 4,
        'label': 'bye'
      },
      {
        'id': 3,
        'label': 'bye'
      },
      {
        'id': 2,
        'label': 'bye'
      },
      {
        'id': 1,
        'label': 'bye'
      }
    ]

新对象

var newObject =

    {
        'hello': [
            {
                'id': 6,
              'label': 'hello'
            },
            {
                'id': 5,
              'label': 'hello'
            },
        ],
        'bye': [
            {
                'id': 4,
              'label': 'bye'
            },
            {
                'id': 3,
              'label': 'bye'
            },
            {
                'id': 2,
              'label': 'bye'
            },
            {
                'id': 1,
              'label': 'bye'
            },
        ]
    }

2 个答案:

答案 0 :(得分:2)

var originalArray =

    [
      {
        'id': 6,
        'label': 'hello'
      },
      {
        'id': 5,
        'label': 'hello'
      },
      {
        'id': 4,
        'label': 'bye'
      },
      {
        'id': 3,
        'label': 'bye'
      },
      {
        'id': 2,
        'label': 'bye'
      },
      {
        'id': 1,
        'label': 'bye'
      }
    ]

var newObject = originalArray.reduce(function(accumulator, current) {
  accumulator[current.label] = accumulator[current.label] || [];
  accumulator[current.label].push({
    id: current.id,
    label: current.label
  });
  return accumulator;
}, {})

在ES6中,使用点差运算符:

var newObject = originalArray.reduce((accumulator, current) => {
  accumulator[current.label] = accumulator[current.label] || [];
  accumulator[current.label].push({...current});
  return accumulator;
}, {})

不直接推动电流的原因是为了避免保持参考。

答案 1 :(得分:0)

您需要迭代整个数组。您可以使用for...in循环执行此操作。

var newObject;
for(var o in originalArray){
    if(o.label == 'hello'){
        var len = object['hello'].length;
        object['hello'][len] = o;
    }else{
        var len = object['bye'].length;
        object['bye'][len] = o;
    }
}