在Javascript中寻找将包含重复数据的列样式数组转换为对象的方法

在Javascript中寻找将包含重复数据的列样式数组转换为对象的方法,javascript,arrays,json,ecmascript-6,javascript-objects,Javascript,Arrays,Json,Ecmascript 6,Javascript Objects,我正在尝试将一个看起来像下面的数组转换为数组下面对象的结构 我已经尝试了很多东西,我也将在下面列出。但我觉得我走错了方向。我想在这方面得到一些帮助 var array = [ ["plan_a", "tester_a", "product", "foo", "blocked", "5"], ["plan_a", "tester_a", "product", "foo", "passed", "10"], ["plan_a", "tester_a", "subproduct", "cl

我正在尝试将一个看起来像下面的数组转换为数组下面对象的结构

我已经尝试了很多东西,我也将在下面列出。但我觉得我走错了方向。我想在这方面得到一些帮助

var array = [
  ["plan_a", "tester_a", "product", "foo", "blocked", "5"],
  ["plan_a", "tester_a", "product", "foo", "passed", "10"],
  ["plan_a", "tester_a", "subproduct", "client", "passed", "15"],
  ["plan_a", "tester_b", "product", "bar", "blocked", "5"],
  ["plan_a", "tester_b", "product", "bar", "passed", "10"],
  ["plan_a", "tester_b", "subproduct", "server", "failed", "5"],
  ["plan_a", "tester_b", "subproduct", "server", "passed", "5"],
  ["plan_a", "tester_c", "product", "foo", "failed", "5"]
];

var object = {
  plan_a: {
    tester_a: {
      product: {
        product: "foo",
        blocked: "5",
        passed: "10"
      },
      subproduct: {
        subproduct: "client",
        passed: "15"
      }
    },
    tester_b: {
      product: {
        product: "bar",
        blocked: "5",
        passed: "10"
      },
      subproduct: {
        subproduct: "server",
        failed: "5",
        passed: "5"
      }
    },
    tester_c: {
      product: {
        product: "foo",
        failed: "5"
      }
    }
  }
};
我试过这个:

var object = {}
var combining_plans =[]
var first_row = arr[0][0];

for (var i = 0; i < arr.length; i++) {
    if (arr[i][0] == first_row) {
        object[arr[i][0]] = [];
        arr[i].shift();
        combining_plans.push(arr[i]);
    }
}

object[first_row] = combining_plans;
var对象={}
var组合_计划=[]
var第一行=arr[0][0];
对于(变量i=0;i
如果第一个元素将第一列转换为对象的第一个键,然后将值添加为数组的所有剩余元素,则会检查第一列是否相同

我一直在考虑为每一个专栏反复这样做,但我觉得这可能行不通,而且还有一种更优雅的方式可以做到这一点。

const数组=[
[“计划a”、“测试仪a”、“产品”、“foo”、“阻止”、“5”],
[“计划a”、“测试仪a”、“产品”、“foo”、“通过”、“10”],
[“计划a”、“测试仪a”、“子产品”、“客户机”、“通过”、“15”],
[“计划a”、“测试仪b”、“产品”、“条”、“阻塞”、“5”],
[“计划a”、“测试仪b”、“产品”、“标准杆”、“通过”、“10”],
[“计划a”、“测试仪b”、“子管道”、“服务器”、“失败”、“5”],
[“计划a”、“测试仪b”、“子产品”、“服务器”、“通过”、“5”],
[“计划a”、“测试仪c”、“产品”、“foo”、“失败”、“5”],
];
const result={};
array.forEach((项)=>{
常量[计划、测试人员、类型、名称、键、值]=项目;
如果(!结果[计划]){
结果[计划]={};
}
如果(!结果[计划][测试仪]){
结果[计划][测试人员]={};
}
如果(!结果[计划][测试仪][类型]){
结果[plan][tester][type]={[type]:name};
}
赋值(结果[plan][tester][type],{[key]:value});
});

控制台日志(结果)
您可以使用
Array.reduce()
Array.forEach()
创建对象:

const数组=[
[“计划a”、“测试仪a”、“产品”、“foo”、“阻止”、“5”],
[“计划a”、“测试仪a”、“产品”、“foo”、“通过”、“10”],
[“计划a”、“测试仪a”、“子产品”、“客户机”、“通过”、“15”],
[“计划a”、“测试仪b”、“产品”、“条”、“阻塞”、“5”],
[“计划a”、“测试仪b”、“产品”、“标准杆”、“通过”、“10”],
[“计划a”、“测试仪b”、“子管道”、“服务器”、“失败”、“5”],
[“计划a”、“测试仪b”、“子产品”、“服务器”、“通过”、“5”],
[“计划a”、“测试仪c”、“产品”、“foo”、“失败”、“5”],
];
const result=array.reduce((r,行)=>{
const val=行[row.length-1];
const path=row.slice(0,-1);
让电流=r;
path.forEach((p,i)=>{
如果(i==4)电流[p]=val;
如果(i==3)当前[路径[2]]=p;
否则{
当前[p]=当前[p]| |{};
电流=电流[p];
}
});
返回r;
}, {});

控制台日志(结果)提供答案的替代方法是映射+减少

您可以将数组映射到类似结果形状的对象块中,并在以下情况下进行深度合并:

const数组=[
[“计划a”、“测试仪a”、“产品”、“foo”、“阻止”、“5”],
[“计划a”、“测试仪a”、“产品”、“foo”、“通过”、“10”],
[“计划a”、“测试仪a”、“子产品”、“客户机”、“通过”、“15”],
[“计划a”、“测试仪b”、“产品”、“条”、“阻塞”、“5”],
[“计划a”、“测试仪b”、“产品”、“标准杆”、“通过”、“10”],
[“计划a”、“测试仪b”、“子管道”、“服务器”、“失败”、“5”],
[“计划a”、“测试仪b”、“子产品”、“服务器”、“通过”、“5”],
[“计划a”、“测试仪c”、“产品”、“foo”、“失败”、“5”]
];
const result=array.map(mapIntoResultChunkShape).reduce(merge);
//来自洛达斯
函数mapIntoResultChunkShape([
产品,,
测试员,
类别名称,
类别价值,
结果名称,
结果值
]) {
返回{
[产品]:{
[测试人员]:{
[类别名称]:{
[类别名称]:类别值,
[结果名称]:结果值
}
}
}
};
}
log(JSON.stringify(result,null,2))