Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何转换对象数组';将数据转换为更有意义的嵌套对象和数组结构?_Javascript - Fatal编程技术网

Javascript 如何转换对象数组';将数据转换为更有意义的嵌套对象和数组结构?

Javascript 如何转换对象数组';将数据转换为更有意义的嵌套对象和数组结构?,javascript,Javascript,除非结构良好,否则数据是无用的。我想通过vanilla JavaScript将对象数组转换成一个更有意义的结构化对象,并以此减少世界上的熵:) 公司的值形成嵌套的命名数组,车辆的值形成嵌套的命名对象。最困难的任务是动态设置if语句。我陷入了代码的结尾,希望JS专业人士能帮我解决这个问题 //源数据格式 var inputs = [ {"vehicle":"car", "company":"Toyota", "model":"Corolla"}, {"vehicle":"car",

除非结构良好,否则数据是无用的。我想通过vanilla JavaScript将对象数组转换成一个更有意义的结构化对象,并以此减少世界上的熵:)

公司的值形成嵌套的命名数组,车辆的值形成嵌套的命名对象。最困难的任务是动态设置if语句。我陷入了代码的结尾,希望JS专业人士能帮我解决这个问题

//源数据格式

var inputs = [
    {"vehicle":"car", "company":"Toyota", "model":"Corolla"},
    {"vehicle":"car", "company":"Toyota", "model":"Rav4"},
    {"vehicle":"car", "company":"Toyota", "model":"Camry"},
    {"vehicle":"car", "company":"Chevrolet", "model":"Malibu"},
    {"vehicle":"car", "company":"Chevrolet", "model":"Camaro"},
    {"vehicle":"rocket", "company":"Tesla", "model":"SpaceX"}
];

const data = {
    car:{
        Toyota:[
            {"vehicle"="car","company"="Toyota", "model"="Corolla"},
            {"vehicle"="car","company"="Toyota", "model"="Rav4"},
            {"vehicle"="car","company"="Toyota", "model"="Camry"}
        ],
        Chevrolet:[
            {"vehicle"="car","company"="Chevrolet", "model"="Malibu"},
            {"vehicle"="car","company"="Chevrolet", "model"="Camaro"}
        ]
    },
    rocket:{
        Tesla:[
            {"vehicle"="rocket","company"="Tesla", "model"="SpaceX"}
        ]
    }
};

//目标数据格式

var inputs = [
    {"vehicle":"car", "company":"Toyota", "model":"Corolla"},
    {"vehicle":"car", "company":"Toyota", "model":"Rav4"},
    {"vehicle":"car", "company":"Toyota", "model":"Camry"},
    {"vehicle":"car", "company":"Chevrolet", "model":"Malibu"},
    {"vehicle":"car", "company":"Chevrolet", "model":"Camaro"},
    {"vehicle":"rocket", "company":"Tesla", "model":"SpaceX"}
];

const data = {
    car:{
        Toyota:[
            {"vehicle"="car","company"="Toyota", "model"="Corolla"},
            {"vehicle"="car","company"="Toyota", "model"="Rav4"},
            {"vehicle"="car","company"="Toyota", "model"="Camry"}
        ],
        Chevrolet:[
            {"vehicle"="car","company"="Chevrolet", "model"="Malibu"},
            {"vehicle"="car","company"="Chevrolet", "model"="Camaro"}
        ]
    },
    rocket:{
        Tesla:[
            {"vehicle"="rocket","company"="Tesla", "model"="SpaceX"}
        ]
    }
};

//未完成的解决方案

// Get all vehicle names.
var vehicles = [];
for (var [key, obj] of inputs.entries()) {
    vehicles.push(obj.vehicle);
}

// Single out only unique vehicle names.
var uniqueVehicles = [...new Set(vehicles)];

// Get all company names.
var arr = [];
for (var [key, obj] of inputs.entries()) {
    arr.push(obj.company);
}

// Single out only unique company names.
var uniqueCompanies = [...new Set(arr)];

// Group objects into arrays by company names.
var dataProperties = {};
for (var comp of uniqueCompanies) {
    dataProperties[comp] = inputs.filter(obj => obj.company === comp);  
}

// Group objects into arrays by vehicle names.
var data = {};
for (var vehi of uniqueVehicles) {
    data[vehi] = inputs.filter(o => o.vehicle === vehi);
}
// data;
// dataProperties;

我会这样做:

函数转换(数据){
让结果={};
data.forEach(元素=>{
//重用现有的车辆对象,如果不存在,则创建一个空的车辆对象
结果[element.vehicle]=结果[element.vehicle]|{};
//重用现有的公司阵列,如果不存在,则创建一个空阵列
结果[element.vehicle][element.company]=结果[element.vehicle][element.company]| |[];
结果[element.vehicle][element.company].push(element);
})
返回结果;
}
常量输入=[
{“车辆”:“汽车”,“公司”:“丰田”,“车型”:“卡罗拉”},
{“车辆”:“汽车”,“公司”:“丰田”,“车型”:“Rav4”},
{“车辆”:“汽车”,“公司”:“丰田”,“车型”:“凯美瑞”},
{“车辆”:“汽车”,“公司”:“雪佛兰”,“车型”:“马里布”},
{“车辆”:“汽车”,“公司”:“雪佛兰”,“车型”:“卡马罗”},
{“车辆”:“火箭”,“公司”:“特斯拉”,“模型”:“太空X”}
];
常量输出=转换(输入);

控制台日志(输出)您可以使用一个更高级的版本,其中包含一组想要的密钥,用于嵌套想要的属性。这个方法与另一个答案有点不同

关键部分是在必要时生成并返回用于将对象推送到结果集的最后一个数组

groups.reduce((p, k, i, { length }) => p[o[k]] = p[o[k]] || (i + 1 === length ? [] : {}), r)
你在哪里

  • p
    作为累加器的对象,从最终结果对象开始
  • k
    分组键
  • i
    组数组的实际索引
  • 如果使用了最后一项,则用于以下检查的组数组的分解长度
    length
在回调内部,所需属性
o[k]
的值用于访问对象
p
,如果没有,如
undefined
,则使用一个数组,如果使用最后一个键,则使用一个数组

var数组=[{车辆:“汽车”,公司:“丰田”,车型:“花冠”},{车辆:“汽车”,公司:“丰田”,车型:“Rav4”},{车辆:“汽车”,公司:“丰田”,车型:“凯美瑞”},{车辆:“汽车”,公司:“雪佛兰”,车型:“马里布”},{车辆:“汽车”,公司:“雪佛兰”,车型:“卡马罗”},{车辆:“火箭”,公司:“特斯拉”,车型:“SpaceX”}],
组=[“车辆”、“公司”],
结果=数组。减少((r,o)=>{
组
.reduce((p,k,i,{length})=>p[o[k]]=p[o[k]]| |(i+1==length?[]:{}),r)
.推(o);
返回r;
}, {});
console.log(结果);

.as控制台包装{最大高度:100%!重要;顶部:0;}
谢谢你,Nicholas!如果可以的话,请你描述一下逻辑,你是如何做到的?我不确定我能描述多少。逻辑是:对于输入数组的每个元素,创建相应的vehicle对象和company数组,然后将元素插入该数组中。唯一额外的一点是重用任何vehicle对象或com已经存在的pany阵列。真正有趣且复杂的解决方案!我想,我将在大约5年内感知到它:)无论如何,非常感谢你,尼娜!@MaksymDudyk,我相信你会更早地找到它。