У меня есть двухмерный массив, как показано ниже

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 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.

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);
2
ozil 17 Дек 2015 в 22:22

3 ответа

Лучший ответ

Вот итеративное решение проблемы:

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
Rick Hitchcock 17 Дек 2015 в 20:01

Вам просто нужно сделать 2 исправления:

Исправление 1: В своем коде вы предполагаете, что testObj является внутренним объектом в списке подкатегорий. Однако вы передаете весь список, а не сам объект. Размышления о параметрах types и предназначения ваших рекурсивных функций помогут вам избежать этой ошибки.

recursive(element, i, testObj.subCategory[0]);

Исправление 2: Чтобы избавиться от атрибута объекта, вам необходимо присвоить ему undefined, а не null.

testObj.subCategory[0].subCategory = undefined;
0
dts 17 Дек 2015 в 19:33

Я считаю, что это то, что вы ищете:

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
Robert Nubel 17 Дек 2015 в 19:41