【问题标题】:Merge keys in JSON object to return an array of merged keys and the value with Javascript合并 JSON 对象中的键以使用 Javascript 返回合并键的数组和值
【发布时间】:2020-07-04 08:17:06
【问题描述】:

我想用 Javascript 将输入转换为输出。有什么帮助吗?输入也可以有更多的嵌套对象。

const input = {
   a: {
     b: 22,
     c: 'hello',
   },
   e: 456
}

const output = [
    { 'a.b': 22},
    { 'a.c': 'hello' },
    { 'e': 456 }
];

【问题讨论】:

  • 您可以提供您尝试过的内容,而不是只提供输入和输出吗?
  • 这里的目标是什么?你为什么想做这样的事情?这只是一个家庭作业/面试问题还是一个实际系统?你会想在这里使用递归并通过树继续转换孩子

标签: javascript arrays json reactjs javascript-objects


【解决方案1】:

您可以为此使用reduce 方法创建递归函数。

const input = {
  a: {
    b: true,
    c: 'hi',
  },
  d: 123
}

function convert(data, prev = '') {
  return Object.entries(data).reduce((r, [k, v]) => {
    let key = prev + (prev ? '.' : '') + k;

    if (typeof v == 'object') {
      r.push(...convert(v, key))
    } else {
      r.push({ [key]: v })
    }

    return r;
  }, [])
}

const result = convert(input)
console.log(result)

【讨论】:

    【解决方案2】:

    // 最佳且快速的解决方法'

    Object.entries(data).reduce((r, [k, v]) => { 使用大 json 时速度较慢。

    基准测试

    Object.entries() 没有更多的循环

    const input = { a: { b: 22, c: "hello", d: { f: 10 } }, e: 456 };
    function flat(data, key = "", result = []) {
      for (let k in data) {
        if (typeof data[k] === "object") {
          flat(data[k], key + k + ".", result);
        } else result.push({ [key + k]: data[k] });
      }
      return result;
    }
    console.log(flat(input));
    

    const input = { a: { b: 22, c: "hello", d: { f: 10 } }, e: 456 };
    function flat(data, key = "", result = []) {
      for (let k in data) {
        if (typeof data[k] === "object") {
          flat(data[k], key + k + ".", result);
        } else result.push({ [key + k]: data[k] });
      }
      return result;
    }
    console.log(flat(input));

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 2010-11-10
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2021-12-16
      • 2021-07-12
      相关资源
      最近更新 更多