如何转换数组';使用Javascript将值转换为每个条目内的不同键?
我有以下数据集。数组中的每个条目都有一个名为“Type”的键,共有三种类型如何转换数组';使用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
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数组方法更酷、更干净。