如何使用Javascript将数组的值转换为每个条目中的不同键

How to convert an array's values into distinct keys within each entry with Javascript?

本文关键字:Javascript 何使用 数组 转换      更新时间:2023-09-26

我有以下数据集。数组中的每个条目都有一个名为"Type"的键,共有三种类型。

var data = [
        {date: "12/27/2012", Type: "http_200", Val: 190, Irrelevant: "Stringa"},
        {date: "12/28/2012", Type: "http_200", Val: 10, Irrelevant: "Stringb"},
        {date: "12/29/2012", Type: "http_404", Val: 100, Irrelevant: "Stringc"},
        {date: "12/30/2012", Type: "http_302", Val: 90, Irrelevant: "Stringd"},
        ];

我希望每个类型都成为自己的键,其值与'Val'的值相同

Result = [
        {date: "12/27/2012",Type: "http_200", Val: 190, http_404: 0, http_200: 190, http_302: 0},
        {date: "12/28/2012",Type: "http_200", Val: 10, http_404: 0, http_200: 10, http_302: 0},
        {date: "12/29/2012",Type: "http_404",Val: 100, http_404: 100, http_200: 0, http_302: 0},
        {date: "12/30/2012",Type: "http_302",Val: 90, http_404: 0, http_200: 0, http_302: 90},
        ];

做这件事最有效的方法是什么?我将在一个更大的数据集上做这个。

还有,是否有可能在不知道所有类型的情况下做到这一点,以便我可以轻松地在任何给定的键上运行它。

我可以尝试下面的东西,但问题是,考虑到数据和类型的数量,对每个键和值都这样做是非常繁琐的

data.forEach(function (d) {
    if(d.Type = 'http_200'){d.http_200=d.Val, d.http_404=0, http_302=0} else {d.http_200=d.0, d.http_404=0, http_302=0};
    if(d.Type = 'http_404'){d.http_200=0, d.http_404=d.Val, http_302=0} else {d.http_200=d.0, d.http_404=0, http_302=0};
    if(d.Type = 'http_302'){d.http_200=0, d.http_404=0, http_302=d.Val} else {d.http_200=d.0, d.http_404=0, http_302=0};
    });

你需要遍历数组两次。首先提取所有类型,然后创建值。

var data = [
    {date: "12/27/2012", Type: "http_200", Val: 190, Irrelevant: "Stringa"},
    {date: "12/28/2012", Type: "http_200", Val: 10, Irrelevant: "Stringb"},
    {date: "12/29/2012", Type: "http_404", Val: 100, Irrelevant: "Stringc"},
    {date: "12/30/2012", Type: "http_302", Val: 90, Irrelevant: "Stringd"},
];
var types = [];
function getTypes(data){
    for (var i = 0, endi = data.length; i<endi; ++i){
        var obj = data[i]
        if(types.indexOf(obj.Type)) types.push(obj.Type);
    }
}
function addAllTypesToData(data, types){
    for (var data_i = 0, data_endi = data.length; data_i<data_endi; ++data_i){
        var obj = data[data_i];
        for (var type_i = 0, type_endi = types.length; type_i<type_endi; ++type_i){
            obj[types[type_i]] = (obj.Type === types[type_i]) ? obj.Val : 0;
        }
    }
}
getTypes(data);
addAllTypesToData(data, types);