Javascript 对象数组:为每个具有值的指定键创建新对象

Javascript 对象数组:为每个具有值的指定键创建新对象,javascript,arrays,object,foreach,Javascript,Arrays,Object,Foreach,我有一个从CSV文件中提取的对象数组,如下所示: const data = [ { name: 'p1', 'date started': 'April 2007', Houston: '375', Dallas: '508', Austin: '', 'El Paso': '1232' }, { name: 'p2', 'date started': 'April 2017', Houston: '', Dallas: '', Austin: '', 'El Paso': '4

我有一个从CSV文件中提取的对象数组,如下所示:

    const data = [
  { name: 'p1', 'date started': 'April 2007', Houston: '375', Dallas: '508', Austin: '', 'El Paso': '1232' },
  { name: 'p2', 'date started': 'April 2017', Houston: '', Dallas: '', Austin: '', 'El Paso': '43' },
  { name: 'p3', 'date started': 'June 2012', Houston: '18789', Dallas: '', Austin: '8977', 'El Paso': '6754656' },
  { name: 'p4', 'date started': 'December 2015', Houston: '878', Dallas: '4556', Austin: '987', 'El Paso': '1456232' }
]
我正在创建一些图表和数据表,需要创建两个新键“位置”和“值”,并为每个对象中的每个位置值创建新对象,如下所示:

    const newData = [
  { location: 'Houston', value: '375', name: 'p1', 'date started': 'April 2007' },
  { location: 'Dallas', value: '508', name: 'p1', 'date started': 'April 2007' },
  { location: 'El Paso', value: '1232', name: 'p1', 'date started': 'April 2007' },
  { location: 'El Paso', value: '43', name: 'p2', 'date started': 'April 2017' },
  { location: 'Houston', value: '18789', name: 'p3', 'date started': 'June 2012' },
  { location: 'Austin', value: '8977', name: 'p3', 'date started': 'June 2012' },
  { location: 'El Paso', value: '6754656', name: 'p3', 'date started': 'June 2012' },
  { location: 'Houston', value: '878', name: 'p4', 'date started': 'December 2015' },
  { location: 'Dallas', value: '4556', name: 'p4', 'date started': 'December 2015' },
  { location: 'Austin', value: '987', name: 'p4', 'date started': 'December 2015' },
  { location: 'El Paso', value: '1456232', name: 'p4', 'date started': 'December 2015' }
]
我以前不得不为一个类似的项目这样做,时间很短,最后手动编辑了原始的CSV文件。我不想再那样做了。到目前为止,我已经尝试了map/forEach和Object.keys的各种组合,但没有成功


任何想法都将不胜感激

您可以迭代对象的所有键,排除不需要的属性,并为结果集构建新对象

var data=[{name:'p1','date start':'2007年4月',休斯顿:'375',达拉斯:'508',奥斯汀:'elpaso':'1232'},{name:'p2','date start':'2017年4月',休斯顿:'',达拉斯:'',奥斯汀:'elpaso':'43'},{name:'p3','date start':'2012年6月',休斯顿:'18789',达拉斯:'',奥斯汀:'8977','elpaso':'6754656'},{姓名:'p4','开始日期':'2015年12月',休斯顿:'878',达拉斯:'4556',奥斯汀:'987','埃尔帕索':'1456232'},
结果=数据。减少(函数(r,o){
Object.keys(o).forEach(函数(k){
如果(['name','datestart'])。包括(k)| |!o[k]){
返回;
}
r、 push({location:k,value:o[k],name:o.name,“date start”:o['date start']});
});
返回r;
}, []);
console.log(结果);

.as console wrapper{max height:100%!important;top:0;}
您可以遍历所有属于旧对象的
项,然后遍历旧对象中的所有键,并在此基础上构建一个新数组,如下所示

const数据=[
{姓名:'p1','date Start':'2007年4月',休斯顿:'375',达拉斯:'508',奥斯汀:'El Paso':'1232'},
{名称:'p2','date started':'2017年4月',休斯顿:'',达拉斯:'',奥斯汀:'','El Paso':'43'},
{姓名:'p3','date Start':'2012年6月',休斯顿:'18789',达拉斯:'',奥斯汀:'8977','El Paso':'6754656'},
{姓名:'p4','date Start':'2015年12月',休斯顿:'878',达拉斯:'4556',奥斯汀:'987','El Paso':'1456232'}
];
函数变换(){
var newObjects=[];
data.forEach(项=>{
Object.keys(item).forEach(keyName=>{
if(keyName!=“name”&&keyName!=“开始日期”){
newObjects.push({
位置:keyName,
值:项[keyName],
[“开始日期”]:项目[“开始日期”],
名称:项目[“名称”]
})
}
});
});
返回新对象;
}

log(transform(data));
通过分解结构分配和rest/spread语法,这变得非常清晰

const数据=[
{姓名:'p1','date Start':'2007年4月',休斯顿:'375',达拉斯:'508',奥斯汀:'El Paso':'1232'},
{名称:'p2','date started':'2017年4月',休斯顿:'',达拉斯:'',奥斯汀:'','El Paso':'43'},
{姓名:'p3','date Start':'2012年6月',休斯顿:'18789',达拉斯:'',奥斯汀:'8977','El Paso':'6754656'},
{姓名:'p4','date Start':'2015年12月',休斯顿:'878',达拉斯:'4556',奥斯汀:'987','El Paso':'1456232'}
];
常量结果=数据减少((res,obj)=>{
const date_start=obj[“date start”];
删除obj[“开始日期”];
常量{name,…rest}=obj;
return[…res,…Object.entries(rest).map([k,v])=>
({location:k,value:v,name:name,“date start”:date_start})
)]
}, []);

console.log(result);
采用完全通用的方法,OP控制所有键值对,这些键值对必须按“原样”分配给每个新创建的数据项…甚至每个数据输入元组的代理键

var数据=[
{姓名:'p1','date Start':'2007年4月',休斯顿:'375',达拉斯:'508',奥斯汀:'El Paso':'1232'},
{名称:'p2','date started':'2017年4月',休斯顿:'',达拉斯:'',奥斯汀:'','El Paso':'43'},
{姓名:'p3','date Start':'2012年6月',休斯顿:'18789',达拉斯:'',奥斯汀:'8977','El Paso':'6754656'},
{姓名:'p4','date Start':'2015年12月',休斯顿:'878',达拉斯:'4556',奥斯汀:'987','El Paso':'1456232'}
];
var newData=data.reduce(函数(收集器、数据项){
变量
//itemEntryList=Object.entries(dataItem);//如果可用,否则下一行。。。
itemEntryList=Object.keys(dataItem).map(函数(键){
返回[key,dataItem[key]];
}),
赋值列表=[],
赋值键,
idx=-1,
keyForDataKey=collector.keyForDataKey,
keyForDataValue=收集器。keyForDataValue,
protectedKeyList=收集器.protectedKeyList;
//对所有必须“按原样”复制的键值对实现本地“拒绝”。
而((assignerKey=itemEntryList[++idx])&&(assignerKey=assignerKey[0])){
if(protectedKeyList.some)函数(protectedKey){
返回(assignerKey==protectedKey);
})) {
push({key:assignerKey,value:itemEntryList[idx][1]});
itemEntryList.拼接(idx,1);
--idx;
}
}
//从“拒绝”步骤后剩余的“dataItem”元组创建新的数据项基础结构。
var dataItemList=itemEntryList.reduce(函数(itemList,dataTuple){
var-tupleValue=dataTuple[1];
if(tupleValue){
var newDataItem={};
newDataItem[keyForDataKey]=数据元组[0];
newDataItem[keyForDataValue]=tupleValue;
itemList.push(newDataItem);
//push({location:dataTuple[0],value:tupleValue});
}
返回项目列表;
}, []);
//对于每个新数据项。。。
映射(函数(newDataItem){
return assignerList.reduce(函数(dataItem,assignerItem){
//…重新分配所有以前被拒绝的键值对