【问题标题】:transform array of nested objects into a JSON like object?将嵌套对象数组转换为类似 JSON 的对象?
【发布时间】:2017-06-08 13:42:54
【问题描述】:

我已经为此寻找了很多地方,但找不到类似的东西。我需要像这样转换嵌套objectsarray

var currentArr = [ 
  { name: 'Michael',   
    children: ['Lara'] 
  },
  { name: 'Susy',    
    children: ['Mike','Ana','Mary']
  },
  { name: 'Bruno', 
    children: ['Clark']
  }
]

像这样进入JSON 对象:

var result = [
    { 'name' : 'Michael', 
      'children': [
            { 'name' : 'Lara' }
    },
    { 'name' : 'Susy', 
      'children': [
            { 'name' : 'Mike' },
            { 'name' : 'Ana' },
            { 'name' : 'Mary' }
      ]
    },
    { 'name' : 'Bruno', 
       'children': [
            { 'name' : 'Clark' }
        ]
    }
]

我尝试过使用嵌套的reducemap,但我无法让它按照我想要的方式构建。特别是在循环遍历来自children 的字符串数组时,我需要返回一个以name 为键的映射结果。

它需要嵌套,因为resultcurrentArr 将是入口点。

【问题讨论】:

  • resultObj 应该是一个数组吧?
  • 这不是一个有效的 JSON 对象。对象的元素是 key: value 对,但您的顶级对象没有任何键。
  • 补充说:它不是 JSON -- 这是一个符号,你不遵守它。
  • 任何认为他们现在可以回答这个问题的人都不能,因为 OP 要求的输出是不可能的。
  • @JuanMendes 查看编辑历史。他最初在阵列周围有{},而不是[]

标签: javascript arrays object dictionary nested


【解决方案1】:

var currentObj = [ 
  { name: 'Michael',   
    children: ['Lara'] 
  },
  { name: 'Susy',    
    children: ['Mike','Ana','Mary']
  },
  { name: 'Bruno', 
    children: ['Clark']
  }
]

for (var i=0, j=currentObj.length; i<j; i++) {
  currentObj[i].children = currentObj[i].children.map(function(item){return {name: item};})  
}
      
console.log(currentObj);

【讨论】:

    【解决方案2】:

    您可以映射每个 children 数组并返回一个新对象。

    var currentObj = [ 
      { name: 'Michael',   
        children: ['Lara'] 
      },
      { name: 'Susy',    
        children: ['Mike','Ana','Mary']
      },
      { name: 'Bruno', 
        children: ['Clark']
      }
    ].map(function(item) {
      item.children = item.children.map(function(child) {
        return { name: child };
      });
    
      return item;
    });
    
    console.log(currentObj);

    【讨论】:

      【解决方案3】:

      这种方式使原始数组保持不变:

      var result = current.map(function (parent) {
          return {
              name: parent.name,
              children: parent.children.map(function (name) {
                  return { name: name };
              })
          };
      });
      
      // if you want a JSON string representing the result object
      var resultJSON = JSON.stringify(result);
      

      另外,正如其他人指出的那样,您的原始代码 sn-p 中的 resultObj 不是有效对象。也许你的意思是它是一个数组?

      【讨论】:

      • 在这种情况下谈论 JSON 是令人困惑的,因为 JSON 是一种表示法,这里我们处理对象。
      【解决方案4】:

      如果修改当前数组是可以接受的,这个 ES2015 代码就足够了:

      currentArr.forEach(function(p) {
          p.children = p.children.map(name => ({ name }));
      });
      

      箭头函数的返回值利用了新的 ES2015 语法,即对象字面量中没有值的裸键获取该名称变量的当前值,即与编写 { "name": name } 相同

      额外的括号是防止大括号被解释为函数体而不是对象字面量所必需的。

      【讨论】:

        【解决方案5】:

        我会这样做:

        var currentArr = [{name: 'Michael',children: ['Lara']},{name: 'Susy',      children: ['Mike', 'Ana', 'Mary']},{name: 'Bruno',children: ['Clark']}]
        
        const map = data => data.map(parent => (
            parent.children.map(
                child => ({ name: child })), parent
        ))
        
        console.log(JSON.stringify(map(currentArr), null, 4))

        注意:

        与 js 中的 c++ , 运算符 , 不同,它返回右端而不是左端

        const data = (1,2,3,4,5,6)
        
        console.log(data)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-04
          • 1970-01-01
          • 2019-03-28
          • 2015-03-26
          相关资源
          最近更新 更多