将对象集转换为数组项

时间:2016-12-08 07:30:54

标签: javascript ecmascript-6 lodash

我有几个这样的对象:

{'id[0]': 2}
{'url[0]': 11}
{'id[1]': 3}
{'url[1]': 14}

我希望得到这样的东西:

[{id:2, url:11}, {id:3, url:14}]

此外,我在我的项目中也有lodash。也许lodash有一些方法吗?

4 个答案:

答案 0 :(得分:5)

您可以为键使用正则表达式,并在必要时创建新对象。然后将值分配给键。

var data = [{ 'id[0]': 2 }, { 'url[0]': 11 }, { 'id[1]': 3 }, { 'url[1]': 14 }],
    result = [];

data.forEach(function (a) {
    Object.keys(a).forEach(function (k) {
        var keys = k.match(/^([^\[]+)\[(\d+)\]$/);
        if (keys.length === 3) {
            result[keys[2]] = result[keys[2]] || {};
            result[keys[2]][keys[1]] = a[k];
        }
    });
});

console.log(result);

答案 1 :(得分:2)

这是基于@NinaScholz solution的ES6解决方案。

我假设对象每个只有一个属性,就像问题中提供的属性一样。

  1. 使用Object#assign将对象数组合并到一个大对象,然后使用Object.entries转换为条目。
  2. 使用Array#reduce迭代数组。
  3. 使用array destructuring从每个条目中提取原始密钥的值。
  4. 使用正则表达式和数组提取所需的键和索引 解构。
  5. 然后使用object spread在索引处创建/更新新对象。
  6. const data = [{ 'id[0]': 2 }, { 'url[0]': 11 }, { 'id[1]': 3 }, { 'url[1]': 14 }];
    
    // combine to one object, and convert to entries
    const result = Object.entries(Object.assign({}, ...data)) 
      // extract the original key and value
      .reduce((r, [k, value]) => {
        
        // extract the key and index while ignoring the full match
        const [, key, index] = k.match(/^([^\[]+)\[(\d+)\]$/);
    
        // create/update the object at the index
        r[index] = {...(r[index] || {}), [key]: value }; 
    
        return r;
      }, []);
    
    console.log(result);

答案 2 :(得分:0)



var arr = [{'id[0]': 2},
{'url[0]': 11},
{'id[1]': 3},
{'url[1]': 14}];

var result = [];

arr.forEach(function(e, i, a){
  var index = +Object.keys(e)[0].split('[')[1].split(']')[0];//get the number inside []
  result[index] = result[index] || {}; //if item is undefined make it empty object 
  result[index][Object.keys(e)[0].split('[')[0]] = e[Object.keys(e)[0]];//add item to object
})

console.log(result);




答案 3 :(得分:0)

您可以使用for循环,.filter()RegExp构造函数与参数"\["+i+"\]",其中i是当前索引,Object.keys(),{{ 1}},.reduce().replace() RegExp

/\[\d+\]/