我有这个对象:
{
'coinRow[0][txID]': 'btc',
'coinRow[0][amountSpent]': '0.33',
'coinRow[0][date]': '28/7/18',
'coinRow[1][txID]': 'btc',
'coinRow[1][amountSpent]': '0.23',
'coinRow[1][date]': '28/7/18'
}
我想将其布置在一个对象中,以便将每个索引分组在一起
[{
txID: 'btc',
amountSpent: 0.33,
date: '28/7/18'
},{
txID: 'ven',
amountSpent: 0.23,
date: '28/7/18'
}]
谢谢!
答案 0 :(得分:1)
您可以使用Object.entries
将对象转换为数组。使用reduce
将数组汇总为一个对象。使用Object.values
将对象转换为数组。
var obj = {
'coinRow[0][txID]': 'btc',
'coinRow[0][amountSpent]': '0.33',
'coinRow[0][date]': '28/7/18',
'coinRow[1][txID]': 'btc',
'coinRow[1][amountSpent]': '0.23',
'coinRow[1][date]': '28/7/18'
};
var result = Object.values(Object.entries(obj).reduce((c, [k, v]) => {
k = k.match(/\[(.*?)\]/g).map(o => o.slice(1, -1));
c[k[0]] = c[k[0]] || {};
c[k[0]][k[1]] = v;
return c;
}, {}));
console.log(result);
如果您的第一个索引是0到N之间的序列号,则可以使用空数组初始化reduce
,而无需使用Object.values
var obj = {
'coinRow[0][txID]': 'btc',
'coinRow[0][amountSpent]': '0.33',
'coinRow[0][date]': '28/7/18',
'coinRow[1][txID]': 'btc',
'coinRow[1][amountSpent]': '0.23',
'coinRow[1][date]': '28/7/18'
};
var result = Object.entries(obj).reduce((c, [k, v]) => {
k = k.match(/\[(.*?)\]/g).map(o => o.slice(1, -1));
c[k[0]] = c[k[0]] || {};
c[k[0]][k[1]] = v;
return c;
}, []);
console.log(result);
答案 1 :(得分:1)
要设置一个值,您可以通过移动给定的对象来分割路径并减少键。如果不存在任何对象,请使用名称或数组创建一个新属性。稍后分配值。
这种方法也适用于嵌套数组。
function setValue(object, path, value) {
var keys = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'),
last = keys.pop();
keys.reduce((o, k, i, a) =>
o[k] = o[k] || (isFinite(i + 1 in a ? a[i + 1] : last) ? [] : {}),
object
)[last] = value;
return object;
}
var data = { 'coinRow[0][txID]': 'btc', 'coinRow[0][amountSpent]': '0.33', 'coinRow[0][date]': '28/7/18', 'coinRow[1][txID]': 'btc', 'coinRow[1][amountSpent]': '0.23', 'coinRow[1][date]': '28/7/18' },
result = Object
.entries(data)
.reduce((o, [k, v]) => setValue(o, k, v), {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }