【问题标题】:Building a tree structure from a JSON object从 JSON 对象构建树结构
【发布时间】:2019-08-20 17:57:09
【问题描述】:

解释:有一个输入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);

任何直接的帮助都将非常重要。谢谢

【问题讨论】:

  • 发布一些您使用的代码,因为我不是向导,或者可能编辑您的问题,因为不清楚您有什么,您想要实现什么,以及如何实现
  • 我已经放了我尝试过的代码,并且我想要从输入 JSON 中输出 JSON 结构。
  • 哦不好意思没看到,以为最后一个只有json

标签: javascript arrays json ecmascript-6


【解决方案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;}

【讨论】:

  • 能否请您删除此答案。我想删除这个问题,但由于对此问题的回答而无法删除。
  • @RohitJindal 为什么要删除它,我已经花了一些时间来回答这个问题。
  • @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));

【讨论】:

  • 能否请您删除此答案。我想删除这个问题,但由于对此问题的回答而无法删除。
  • @RohitJindal 为什么要删除您的问题?人们投入时间,并为您提供合法问题的合法答案。恕我直言,这似乎不是一个公平的要求。您是否有非常令人信服的正当理由将他们的贡献删除?
  • 能否更新我在问题中提到的答案中的 JSON。
  • @RohitJindal 我会更新我的答案。我猜您在原始请求中包含敏感数据。以后请小心。
猜你喜欢
  • 2020-06-08
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
相关资源
最近更新 更多