【问题标题】:How to merge object properties with array indexes in their names into a single array?如何将对象属性及其名称中的数组索引合并到一个数组中?
【发布时间】:2018-03-16 09:37:21
【问题描述】:

我有一个这样的对象

var obj = {
  'Lorem': 'foo',
  'Ipsum[0]': 'bar',
  'Ipsum[1]': 'stuff',
  'Dolor[0][0]': 'foo',
  'Dolor[0][1]': 'bar',
  'Dolor[1][0]': 'stuff',
  'Dolor[1][1]': 'foo'
};

我想把它变成这个

var obj = {
  'Lorem': 'foo',
  'Ipsum': ['bar', 'stuff'],
  'Dolor': [
    ['foo', 'bar'],
    ['stuff', 'foo']
  ]
};

我发现from here.match(/[^\[\]]+/g) 可以得到括号之间的值,但我不知道如何处理它们。

【问题讨论】:

  • 顺便说一句,'Ipsum[0]': 'stuff', 正在覆盖 'bar'
  • @NinaScholz 我的错误,已编辑。

标签: javascript arrays object multidimensional-array


【解决方案1】:

您可以使用正则表达式(我为嵌套对象添加了一个点)并通过遍历给定对象来减少路径。如果不存在对象,则使用名称或数组创建一个新属性。稍后分配值。

function setValue(object, path, value) {
    var way = path.match(/[^\[\].]+/g),
        last = way.pop();

    way.reduce(function (o, k, i, kk) {
        return o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {});
    }, object)[last] = value;
}

var obj = { 'Lorem': 'foo', 'Ipsum[0]': 'bar', 'Ipsum[1]': 'stuff', 'Dolor[0][0]': 'foo', 'Dolor[0][1]': 'bar', 'Dolor[1][0]': 'stuff', 'Dolor[1][1]': 'foo' };

Object.keys(obj).forEach(function (k) {
    var v = obj[k];
    delete obj[k];
    setValue(obj, k, v);
});

console.log(obj);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2018-04-08
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多