【问题标题】:Build one object by using array of objects (recursively with subobjects)使用对象数组构建一个对象(使用子对象递归)
【发布时间】:2019-11-10 14:52:02
【问题描述】:

也许有人可以在这里提供帮助。

我想做的是:

  • 构建一个包含数组中所有这些对象的所有属性/子对象的结果 obj
  • 结果 obj 中始终只有数组
  • 递归构建此对象(因为我不知道可能有多少层,也不知道对象的名称)
  • 属性的顺序不相关
  • 某些属性(如id)的可管理除外/黑名单

const arr = [{
    id: 0,
    nickname: 'Testnick 0',
    loel: {
      nice: 'like it',
    },
    rating: {
      abc: 5,
      helloworld: 2,
    },
  },
  {
    id: 1,
    nickname: 'Testnick 2',
    rating: {
      abc: 4,
      moep: 1,
    },
  },
  {
    id: 2,
    nickname: 'Testnick 3',
    rating: {
      abc: 40,
      sun: 20,
      anotherObj: {
        tr: 34,
        subsubobj: {
          sd: 24,
        },
      },
    },
  },
];

所以 resultobj 看起来类似于:

const result = {
  id: [0, 1, 2],
  nickname: ['Testnick 0', 'Testnick 2', 'Testnick 3'],
  loel: {
    nice: ['like it'],
  },
  rating: {
    abc: [5, 4, 40],
    helloworld: [2],
    moep: [1],
    sun: [20],
    anotherObj: {
      tr: [34],
      subsubobj: {
        sd: [24],
      },
    },
  },
};

有人可以帮忙吗?

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 使用常量值来做,但是由于我不知道关卡的数量和属性名称,需要另想办法

标签: javascript arrays object reduce


【解决方案1】:

您可以减少给定的数组并递归地迭代对象的键和值以获取嵌套对象。

function setValues(target, source) {
    Object.entries(source).forEach(([k, v]) => {
        if (v && typeof v === 'object') {
            setValues(target[k] = target[k] || {}, v);
        } else {
            target[k] = target[k] || [];
            target[k].push(v);
        }
    });
    return target;
}

var data = [{ id: 0, nickname: 'Testnick 0', loel: { nice: 'like it' }, rating: { abc: 5, helloworld: 2 } }, { id: 1, nickname: 'Testnick 2', rating: { abc: 4, moep: 1 } }, { id: 2, nickname: 'Testnick 3', rating: { abc: 40, sun: 20, anotherObj: { tr: 34, subsubobj: { sd: 24 } } } }],
    result = data.reduce(setValues, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • Gives me TypeError: target[k].push is not a function 有时,需要调试。不过谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 2017-01-02
  • 1970-01-01
  • 2019-12-24
  • 2020-04-24
  • 2023-01-08
  • 2019-10-26
  • 2018-01-25
相关资源
最近更新 更多