Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.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_Object_Ecmascript 6_Lodash_Flatten - Fatal编程技术网

Javascript 展平嵌套的对象数组,将键重命名为迭代器

Javascript 展平嵌套的对象数组,将键重命名为迭代器,javascript,object,ecmascript-6,lodash,flatten,Javascript,Object,Ecmascript 6,Lodash,Flatten,我有一个对象数组,每个对象如下所示(轮询响应): 我需要展平由responses键访问的数组,以便每个对象都可以键控到其迭代器 最后一个对象应该是这样的: { "slug": "18-AZ-Gov-GE-DvF", "name": "2018 Arizona Gubernatorial GE", "tags": [], "charts": [], "election_date": "2018-11-06", "n_polls": 1, "created_at": "2017-06-13T13:3

我有一个对象数组,每个对象如下所示(轮询响应):

我需要展平由
responses
键访问的数组,以便每个对象都可以键控到其迭代器

最后一个对象应该是这样的:

{
"slug": "18-AZ-Gov-GE-DvF",
"name": "2018 Arizona Gubernatorial GE",
"tags": [],
"charts": [],
"election_date": "2018-11-06",
"n_polls": 1,
"created_at": "2017-06-13T13:32:26.000Z",
 "label1": "Ducey",
 "name1": "Doug Ducey",
 "party1": "Republican",
 "incumbent1": true
 "label2": "Farley",
 "name2": "Steve Farley",
 "party2": "Democrat",
 "incumbent2": false
 "label3": "Other",
 "name3": "Other",
 "party3": null,
 "incumbent3": false
 "label4": "Undecided",
 "name4": "Undecided",
 "party4": null,
  "incumbent4": false
},
对集合执行展平或缩放时,不会重命名对象关键帧


我已经尝试了几种解决方案,但在真正深入研究之前,我想看看是否有一种简单的es6方法。

使用数组
。reduce
方法在这里可能很有效。由于
reduce
回调将接收当前索引作为第三个参数,因此您可以使用它来创建要查找的键

例如:

const myArray=[
{
“标签”:“Ducey”,
“姓名”:“Doug Ducey”,
“政党”:“共和党”,
“现任”:正确
},
{
“标签”:“Farley”,
“姓名”:“史蒂夫·法利”,
“党”:“民主党人”,
“现任”:假
},
{
“标签”:“其他”,
“名称”:“其他”,
“一方”:无效,
“现任”:假
},
{
“标签”:“未决定”,
“名称”:“未决定”,
“一方”:无效,
“现任”:假
}
]
常量展平=myArray.reduce((展平、项目、索引)=>({
平的
…对象。键(项)。减少((编号,键)=>({
…编号,
[键+(索引+1)]:项[键],
}), {}),
}), {});

原木(扁平)
您可以使用
forEach
浏览
响应
数组,并在对象上为每个对象中的
条目
分配一个新键。之后,只需
删除
原始
响应
数组:

let obj={“slug”:“18 AZ Gov GE DvF”,“姓名”:“2018亚利桑那州州长通用电气”,“标签”:[],“图表”:[],“选举日期”:“2018-11-06”,“n_民调”:1,“创建时间”:“2017-06-13T13:32:26.000Z”,“回应”:[{“标签”:“杜西”,“姓名”:“道格杜西”,“政党”:“共和党”,“在任者”:真的},{“标签”:“法利”,“姓名”,“党”:“民主党人”,“在任者”:假},{“标签”:“其他”,“姓名”:“其他”,“党”:空,“在任者”:假},{“标签”:“未决定”,“姓名”:“未决定”,“党”:空,“在任者”:假}
obj.responses.forEach((项目,i)=>{
//项是响应中的一个对象
//i是从0开始的索引。请在键上单击该索引
Object.entries(item.forEach([k,v])=>obj[k+(i+1)]=v)
})
//不再需要obj.response
删除obj.responses

log(obj)
一种方法将使用一些较新的产品,包括、和最重要的

主要要点是使用一个减缩器将
响应
数组转换为一个新对象,每个元素对象使用一个辅助减缩器用迭代器计数修改键,并用新键将值分配给外部对象

这种方法的一个关键好处是原始对象(包括其子对象)不会被修改(阅读:无副作用)

const flatten=responses.reduce((o,g,i)=>{
Object.entries(g).reduce((t[k,v])=>{
t[`k}${i+1}`]=v;
返回t;
},o);
返回o;
},
{});
完整工作示例:

const-orig={
“slug”:“18 AZ Gov GE DvF”,
“名称”:“2018亚利桑那州州长GE”,
“标签”:[],
“图表”:[],
“选举日期”:“2018-11-06”,
“n_民意测验”:1,
“创建时间”:“2017-06-13T13:32:26.000Z”,
“答复”:[{
“标签”:“Ducey”,
“姓名”:“Doug Ducey”,
“政党”:“共和党”,
“现任”:正确
},
{
“标签”:“Farley”,
“姓名”:“史蒂夫·法利”,
“党”:“民主党人”,
“现任”:假
},
{
“标签”:“其他”,
“名称”:“其他”,
“一方”:无效,
“现任”:假
},
{
“标签”:“未决定”,
“名称”:“未决定”,
“一方”:无效,
“现任”:假
}
]
};
常量{responses,…foo}=orig;
常数展平=响应。减少((o,g,i)=>{
Object.entries(g).reduce((t[k,v])=>{
t[`k}${i+1}`]=v;
返回t;
},o);
返回o;
},
{});
log({展平:{…foo,…展平}});

console.log({orig});
您可以对响应和其他数据进行分解,然后使用索引键将每个响应缩减为一个对象,然后通过对象扩展运算符组合结果:

const { responses, ...other } = data
const indexedResponses = responses.reduce((acc, r, i) => {
  Object.entries(r).forEach(([key, value]) => {
    acc[`${key}${i + 1}`] = value
  })
  return acc
}, {})
const result = { ...other, ...indexedResponses }
const { responses, ...other } = data
const indexedResponses = responses.reduce((acc, r, i) => {
  Object.entries(r).forEach(([key, value]) => {
    acc[`${key}${i + 1}`] = value
  })
  return acc
}, {})
const result = { ...other, ...indexedResponses }