Построение древовидной структуры из объекта JSON

#javascript #arrays #json #ecmascript-6

#javascript #массивы #json #ecmascript-6

Вопрос:

Существует входной JSON в соответствии с приведенным ниже форматом.

 var inputJSON = [{
    "TestScenario": "test1",
    "Application": "application1",
    "Market": "M1"
}, {
    "TestScenario": "test1",
    "Application": "application1",
    "Market": "M2"
}, {
    "TestScenario": "test1",
    "Application": "application1",
    "Market": "M3"
}, {
    "TestScenario": "test1",
    "Application": "application1",
    "Market": "M4"
}, {
    "TestScenario": "test2",
    "Application": "application2",
    "Market": "M5"
}, {
    "TestScenario": "test2",
    "Application": "application3",
    "Market": "M5"
}];
  

Это должно быть структурировано как дерево в формате ниже.

 var outputJSON = [{
    "test1": {
        "application1": ["M1", "M2", "M3", "M4"]
    }
}, {
    "test2": {
        "application2": "M5",
        "application3": "M5"
    }
}];
  

Что я пробовал до сих пор:

Я могу получить формат дерева с помощью одного вида TestScenario , но для нескольких разрывов кода.

Рабочий код для такого же типа TestScenario :

 var defaultArrays = [{
"TestScenario": "test1",
"Application": "application1",
"Market": "M1"
}, {
"TestScenario": "test1",
"Application": "application1",
"Market": "M2"
}, {
"TestScenario": "test1",
"Application": "application1",
"Market": "M3"
}, {
"TestScenario": "test1",
"Application": "application1",
"Market": "M4"
}];

var testScenario = [];

for (const data of defaultArrays) {
    if(testScenario.indexOf(data.TestScenario) === -1) {
        testScenario.push(data.TestScenario);
  }
}

var marketArray = [];
var shouldLookLikeThis = [];
var obj = {};
for (const b of defaultArrays) {
    for (const c of testScenario) {
        if (b.TestScenario === c) {
      obj[c] = {};
      obj[c][b.Application] = [];
      }
      if (shouldLookLikeThis.indexOf(obj) === -1) {
        shouldLookLikeThis.push(obj);
      }
    }
    
    for (const c of shouldLookLikeThis) {
      var arr1 = Object.keys(c);
      for (const d of arr1) {
        if (b.TestScenario === d) {
            var arr2 = Object.keys(c[d]);
          for (const e of arr2) {
            if(b.Application === e) {
                            marketArray.push(b.Market);
                c[d][e] = marketArray;
            }
          }
        }
      }
    }
  }
  
console.log('shouldLookLikeThis', shouldLookLikeThis);  

Не работает с несколькими TestScenario :

 var defaultArrays = [{
"TestScenario": "test1",
"Application": "application1",
"Market": "M1"
}, {
"TestScenario": "test1",
"Application": "application1",
"Market": "M2"
}, {
"TestScenario": "test1",
"Application": "application1",
"Market": "M3"
}, {
"TestScenario": "test1",
"Application": "application1",
"Market": "M4"
}, {
"TestScenario": "test2",
"Application": "application2",
"Market": "M5"
}, {
"TestScenario": "test2",
"Application": "application3",
"Market": "M5"
}];
var testScenario = [];

for (const data of defaultArrays) {
    if(testScenario.indexOf(data.TestScenario) === -1) {
        testScenario.push(data.TestScenario);
  }
}

var marketArray = [];
var shouldLookLikeThis = [];
var obj = {};
for (const b of defaultArrays) {
    for (const c of testScenario) {
        if (b.TestScenario === c) {
      obj[c] = {};
      obj[c][b.Application] = [];
      }
      if (shouldLookLikeThis.indexOf(obj) === -1) {
        shouldLookLikeThis.push(obj);
      }
    }
    
    for (const c of shouldLookLikeThis) {
      var arr1 = Object.keys(c);
      for (const d of arr1) {
        if (b.TestScenario === d) {
            var arr2 = Object.keys(c[d]);
          for (const e of arr2) {
            if(b.Application === e) {
                            marketArray.push(b.Market);
                c[d][e] = marketArray;
            }
          }
        }
      }
    }
  }
  
console.log('shouldLookLikeThis', shouldLookLikeThis);  

Комментарии:

1. опубликуйте некоторый код, который вы использовали, потому что я не мастер, или, возможно, отредактируйте свой вопрос, потому что неясно, что у вас есть и чего вы хотите достичь, и как

2. Я уже вставил код, который я пробовал, а также я хочу вывести структуру JSON из входного JSON.

3. о, извините, не видел этого, думал, что последний был только json

Ответ №1:

Одним из возможных решений является использование Array.reduce() для первого выполнения процедуры группировки. После этого вы могли бы Array.map() из Object.entries() предыдущего результата, чтобы получить желаемую структуру.

Пример:

 var inputJSON = [
  {"TestScenario": "test1", "Application": "application1", "Market": "M1"},
  {"TestScenario": "test1", "Application": "application1", "Market": "M2"},
  {"TestScenario": "test1", "Application": "application1", "Market": "M3"},
  {"TestScenario": "test1", "Application": "application1", "Market": "M4"},
  {"TestScenario": "test2", "Application": "application2", "Market": "M5"},
  {"TestScenario": "test2", "Application": "application3", "Market": "M5"}
];

let res = inputJSON.reduce((acc, {TestScenario, Application, Market}) =>
{
    acc[TestScenario] = acc[TestScenario] || {};
    acc[TestScenario][Application] = acc[TestScenario][Application] || [];
    acc[TestScenario][Application].push(Market);
    return acc;
}, {})

res = Object.entries(res).map(([key, val]) => ({[key]: val}));

console.log(res);  
 .as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}  

Комментарии:

1. Не могли бы вы, пожалуйста, удалить этот ответ. Я хочу удалить этот вопрос, но не могу удалить из-за ответов на это.

2. @RohitJindal Почему вы хотите это удалить, я уже потратил некоторое время на то, чтобы ответить на этот вопрос.

3. @RohitJindal почему вы хотите удалить свой вопрос? Люди потратили свое время и дали вам законные ответы на законный вопрос. Это не кажется справедливым запросом, ИМХО. У вас есть веская, законная причина для удаления их вклада?

Ответ №2:

Я создал объект из разных тестовых сценариев, повторил входные данные для заполнения тестовых сценариев, а затем преобразовал выходные данные обратно в массив в соответствии с вашим запросом на форматирование.

 var inputJSON = [{
    "TestScenario": "test1",
    "Application": "application1",
    "Market": "M1"
}, {
    "TestScenario": "test1",
    "Application": "application1",
    "Market": "M2"
}, {
    "TestScenario": "test1",
    "Application": "application1",
    "Market": "M3"
}, {
    "TestScenario": "test1",
    "Application": "application1",
    "Market": "M4"
}, {
    "TestScenario": "test2",
    "Application": "application2",
    "Market": "M5"
}, {
    "TestScenario": "test2",
    "Application": "application3",
    "Market": "M5"
}];

function convertJson(inp) {
    let out = {};
    
    inp.forEach(function(o) {
       if (!out[o.TestScenario]) {
         out[o.TestScenario] = {};
       }
       
       if (!out[o.TestScenario][o.Application.trim()]) {
         out[o.TestScenario][o.Application.trim()] = [];
       }
       
       out[o.TestScenario][o.Application.trim()].push(o.Market.trim());
       
   });
   
  let outArray = Object.keys(out).map(function(k) {
    let d = {};
    d[k] = out[k];
    
    return d;
  });
  
  return outArray;
}

console.log(convertJson(inputJSON));  

Комментарии:

1. Не могли бы вы, пожалуйста, удалить этот ответ. Я хочу удалить этот вопрос, но не могу удалить из-за ответов на это.

2. @RohitJindal почему вы хотите удалить свой вопрос? Люди потратили свое время и дали вам законные ответы на законный вопрос. Это не кажется справедливым запросом, ИМХО. У вас есть веская, законная причина для удаления их вклада?

3. Не могли бы вы, пожалуйста, обновить JSON в своем ответе, который я упомянул в своем вопросе.

4. @RohitJindal Я обновлю свой ответ. Я предполагаю, что вы включили конфиденциальные данные в свой первоначальный запрос. Пожалуйста, будьте осторожны в будущем.