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

如何转换数组';使用Javascript将值转换为每个条目内的不同键?,javascript,arrays,list,for-loop,Javascript,Arrays,List,For Loop,我有以下数据集。数组中的每个条目都有一个名为“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: "ht

我有以下数据集。数组中的每个条目都有一个名为“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);
var数据=[
{日期:“2012年12月27日”,键入:“http_200”,Val:190,无关:“Stringa”},
{日期:“2012年12月28日”,键入:“http_200”,Val:10,不相关:“Stringb”},
{日期:“2012年12月29日”,键入:“http_404”,Val:100,无关:“Stringc”},
{日期:“2012年12月30日”,键入:“http_302”,Val:90,无关:“string”},
];
var类型=[];
函数getTypes(数据){

对于(var i=0,endi=data.length;i您尝试过什么?您知道如何读取
Type
Val
属性吗?您知道如何使用变量作为属性名称吗?具体问题在哪里?…数据来自哪里?这是源于JSON还是JavaScript代码中构造的对象?Most将使用
Array.prototype.map()
将对象数组转换为首选形式。如果不知道所有可能的类型,就不可能一次完成。@techfoobar:我打赌一个简单的
for
循环更有效。如果对象继承自构造函数的原型,实际上可以一次完成。例如:
if(!(obj.Type in obj)){Foo.prototype[obj.Type]=0;}
。虽然事先知道会更好。@techfoobar循环通常比ES5数组方法更快。但IMO数组方法更酷、更干净。