首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将n长二维数组转换为n级嵌套对象

将n长二维数组转换为n级嵌套对象
EN

Stack Overflow用户
提问于 2015-12-17 19:22:41
回答 3查看 55关注 0票数 2

我有如下所示的二维数组

代码语言:javascript
复制
var testData = [
  ["level-1", "level-2", "level-3", 109], // goes to level-n
  ["level-1", "level-2", "level-3", 25],  // goes to level-n
  ["level-1", "level-2", "level-3", 20],  // goes to level-n
  ["level-1", "level-2", "level-3", 17],  // goes to level-n
];  

我需要把它转换成下面的结构

代码语言:javascript
复制
var resultData = [{
  "name": "level-1",
  "sub-name": [{
    "name": "level-2",
    "sub-name": [{
      "name": "level-3",
      "val": 109
    }]
  }]
}, {
  "name": "level-1",
  "sub-name": [{
    "name": "level-2",
    "sub-name": [{
      "name": "level-3",
      "val": 25
    }]
  }]
}, {
  "name": "level-1",
  "sub-name": [{
    "name": "level-2",
    "sub-name": [{
      "name": "level-3",
      "val": 20
    }]
  }]
}, {
  "name": "level-1",
  "sub-name": [{
    "name": "level-2",
    "sub-name": [{
      "name": "level-3",
      "val": 17
    }]
  }]
}];

我试过以下几种方法,但是它缺少级别-1和显示级别-3而不是级别-2。

代码语言:javascript
复制
var testData = [
  ["level-1", "level-2", "level-3", 109], // goes to level-n
  ["level-1", "level-2", "level-3", 25],  // goes to level-n
  ["level-1", "level-2", "level-3", 20],  // goes to level-n
  ["level-1", "level-2", "level-3", 17],  // goes to level-n
];
var index = 3;
var testArray = [];


function converter(d) {

  d.forEach(function(b) {
    recursive(b, 0);
  });

}

function recursive(element, i, testObj) {
  testObj = testObj || {};
  testObj.name = element[i];
  testObj.category = element[i];
  testObj.subCategory = [{}];
  ++i;
  if (i < index) {
    recursive(element, i, testObj);
  }
  if (i == index) {
    testObj.subCategory[0].name = element[index - 1];
    testObj.subCategory[0].val = element[index];
    testObj.subCategory[0].subCategory = null;
    return testObj;
  }
	document.write('<pre>' + JSON.stringify(testObj, 0, 4) + '</pre>');
}
converter(testData);

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-17 19:47:42

下面是这个问题的迭代解决方案:

代码语言:javascript
复制
var testData = [
  ["level-1", "level-2", "level-3", 109], // goes to level-n
  ["level-1", "level-2", "level-3", 25],  // goes to level-n
  ["level-1", "level-2", "level-3", 20],  // goes to level-n
  ["level-1", "level-2", "level-3", 17],  // goes to level-n
],
  resultData= [];

testData.forEach(function(a) {
  var obj = {};
  resultData.push(obj);

  a.forEach(function(val, idx) {
    if(idx < a.length - 2) {
      obj.name= val;
      obj['sub-name']= [{}];
      obj= obj['sub-name'][0];
    }
    else {
      obj.name= a[idx - 1];
      obj.val= val;
    }
  });
});

document.body.innerHTML= '<pre>'+JSON.stringify(resultData, null, 2)+'</pre>';

票数 0
EN

Stack Overflow用户

发布于 2015-12-17 19:41:32

我相信这就是你要找的:

代码语言:javascript
复制
var testData = [
  ["level-1", "level-2", "level-3", 109], // goes to level-n
  ["level-1", "level-2", "level-3", 25],  // goes to level-n
  ["level-1", "level-2", "level-3", 20],  // goes to level-n
  ["level-1", "level-2", "level-3", 17],  // goes to level-n
]; 

objectify = function(vals) {
  if (vals.length <= 2) {
    return { name: vals[0], val: vals[1] }
  } else {
    var name = vals.shift()
    return { "name": name,    
             "sub-name": [objectify(vals)] }
  }
}

result = testData.map(objectify)

console.log(JSON.stringify(result))

(参见jsfiddle:https://jsfiddle.net/74o5gkmc/)

票数 2
EN

Stack Overflow用户

发布于 2015-12-17 19:33:32

你只需要做两个修复:

修正1:在代码中,假设testObj是子类别列表的内部对象。但是,您传递的是整个列表,而不是对象本身。考虑递归函数参数的类型和用途将有助于您避免这个错误。

代码语言:javascript
复制
recursive(element, i, testObj.subCategory[0]);

修正2:要摆脱对象属性,需要将undefined分配给它,而不是null

代码语言:javascript
复制
testObj.subCategory[0].subCategory = undefined;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34342598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档