在JS中对数组键进行分组

时间:2018-10-31 07:37:21

标签: javascript

我有这个对象:

{ 
  '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'
}]

谢谢!

2 个答案:

答案 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; }