我有几个这样的对象:
{'id[0]': 2}
{'url[0]': 11}
{'id[1]': 3}
{'url[1]': 14}
我希望得到这样的东西:
[{id:2, url:11}, {id:3, url:14}]
此外,我在我的项目中也有lodash。也许lodash有一些方法吗?
答案 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解决方案。
我假设对象每个只有一个属性,就像问题中提供的属性一样。
Object#assign
将对象数组合并到一个大对象,然后使用Object.entries
转换为条目。Array#reduce
迭代数组。
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+\]/