如何在Javascript中将对象数组重新映射为对象的对象

如何在Javascript中将对象数组重新映射为对象的对象,javascript,arrays,data-structures,mapping,Javascript,Arrays,Data Structures,Mapping,我有这个价值: const sample = [{ name: "name", value1: 1, mean: 2, create: 10, age: "age", player1: 20, player2: 40, sample: "sample", player3: 30, player4: 100, }]; 要映射到: { name: { value: 1, m

我有这个价值:

const sample = [{

  name: "name",
  value1: 1,
  mean: 2,
  create: 10,

  age: "age",
  player1: 20,
  player2: 40,

  sample: "sample",
  player3: 30,
  player4: 100,
}];
要映射到:

{
  name: {
    value: 1,
    mean: 2,
    create: 10
  },
  age: {
    player1: 20,
    player2: 40
  },
  sample: {
    player3: 30,
    player4: 100
  }
}
我知道我能做的是手动映射,但我的列表大约有50个,所以这是不可能的

编辑:


key属性将是if,它是string,数字将是按该顺序排列的值

您可以使用函数在对象上迭代,并跟踪最后一个
向其添加整数属性:

const示例=[
{
姓名:“姓名”,
价值1:1,
平均值:2,
创建:10,
年龄:“年龄”,
播放者1:20,
播放者2:40,
样本:“样本”,
播放者1A:30,
播放者2A:100,
},
{
姓名:“姓名”,
价值1:11,
平均:22,
创建:130,
年龄:“年龄”,
播放者1:210,
播放者2:430,
样本:“样本”,
播放者1A:340,
播放器2A:1100,
},
{
姓名:“姓名”,
价值:313,
平均数:421,
创建:23,
年龄:“年龄”,
播放者1A:440,
播放者2A:40,
}
];
让lastKey=null;
让mapped=sample.map(elem=>{
设obj={any:{}};
让any=obj.any;
用于(要素中的var p){
设key=p,value=elem[p];
if(类型(值)=“字符串”){
任意[键]={};
lastKey=密钥;
}else if(类型(值)=“数字”){
如果(最后一个键)
任意[lastKey][key]=值;
其他的
任意[键]=值;
}
}
返回obj;
});
console.log(映射)用于将数组和现有属性缩减为所需格式

const示例=[
{
姓名:“姓名”,
价值1:1,
平均值:2,
创建:10,
年龄:“年龄”,
播放者1:20,
播放者2:40,
}
];
const result=sample.reduce((acc,{value1,mean,create,player1,player2})=>{
加速推({
姓名:{
价值1,
意思是
创造
},
年龄:{
玩家1,
玩家2
}
});
返回acc;
}, []);
控制台日志(结果)用于将其映射到内部的新对象结构

const示例=[
{
姓名:“姓名”,
价值1:1,
平均值:2,
创建:10,
年龄:“年龄”,
播放者1:20,
播放者2:40,
}
];
让结果=sample.map(elem=>({
任何:{
姓名:{
价值:要素价值1,
平均数:元素平均数,
创建:elem.create
},
年龄:{
player1:elem.player1,
player2:elem.player2
}
}
}))

控制台日志(结果)
要正确执行此操作,需要在最后一个对象中指定属于
名称
年龄
的属性,如下例所示:

const示例=[
{
姓名:“姓名”,
价值1:1,
平均值:2,
创建:10,
年龄:“年龄”,
播放者1:20,
播放者2:40
},
{
姓名:“弗雷德”,
价值1:3,
平均值:5,
创建:101,
年龄:“年龄”,
播放者1:202,
播放者2:401
}
];
常量keyValuesMap={
//'name'属性将具有'value1'、'mean'和'create'属性
名称:[“value1”、“mean”、“create”],
//'age'属性将具有'player1'和'player2'属性
年龄:[“玩家1”、“玩家2”]
};
const result=sample.map((项目)=>{
//映射“sample”数据并获取每个数据的键/值对
//项,然后使用“reduce”根据
//上面指定的'keyValuesMap'
返回Object.entries(item).reduce((累加器,[键,值])=>{
const name=accumulator.name | |{};
const age=累加器.age | |{};
//如果值属于'name'属性,请添加到该属性中
if(键值映射名称包括(键)){
名称[键]=值;
}
//如果值属于'age'属性,则添加到该属性中
if(键值映射年龄包括(键)){
年龄[关键]=价值;
}
acculator.name=名称;
年龄=年龄;
回流蓄能器;
}, {});
});

console.log(“结果”,result)您可能想要这样的东西

const sample=[{name:“name”,value1:1,mean:2,create:10,age:“age”,player1:20,player2:40,},];
res=样本减少((r,c)=>{
让钥匙;
Object.entries(c.forEach)(o)=>{
(k=o[0]),(v=o[1]);
typeof v==“string”?((key=v),(r[v]={})):(r[key][k]=v);
});
返回r;
}, {});

控制台日志(res)您的描述不清楚,但是,我认为您希望将一组属性重新映射到一个新属性,前提是键和值相同

此外,我放置了一个新的key=value=“other”,之后的属性被分组在“other”下,因此您不必指定所有的键

const示例=[{
姓名:“姓名”,
价值1:1,
平均值:2,
创建:10,
年龄:“年龄”,
播放者1:20,
播放者2:40,
}, {
姓名:“姓名”,
价值1:1,
平均值:2,
创建:10,
年龄:“年龄”,
播放者1:20,
播放者2:40,
其他:“其他”,
p2:“ldkdskd”,
p1:10
}];
函数remapdata(数据){
常量obj={};
常量键=对象键(数据);
设lastGroup=未定义;
设i=0;`在此处输入代码`
while(i

.as console wrapper{min height:100%!important;top:0;}
每个人都应该意识到,任何重构任何对象的键值对的方法实际上都依赖于一个结构,该结构必须始终确保,例如
object.keys
的键值顺序准确地表示任何键值的创建顺序。此外,创建此类对象的环境也必须确保这种可行且可复制的顺序

如果可以概括为,“…只要在键值对
key
中等于
value
,就要创建一个通过
key
分配给重采样结构的新对象”,就应该