Javascript 创建对象数组时遇到问题
我有一个数组,我想选取其中的3个元素并将其作为单个对象存储在另一个数组中,然后在数组的每3个元素上重复执行相同的过程。下面是我的代码:Javascript 创建对象数组时遇到问题,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,我有一个数组,我想选取其中的3个元素并将其作为单个对象存储在另一个数组中,然后在数组的每3个元素上重复执行相同的过程。下面是我的代码: let断点=[ {name:“from amonut”,value:“100”}, {name:“to amonut”,value:“200”}, {名称:“gst”,值:“10”}, {name:“from amonut”,value:“200”}, {name:“to amonut”,value:“300”}, {名称:“gst”,值:“20”}, {na
let断点=[
{name:“from amonut”,value:“100”},
{name:“to amonut”,value:“200”},
{名称:“gst”,值:“10”},
{name:“from amonut”,value:“200”},
{name:“to amonut”,value:“300”},
{名称:“gst”,值:“20”},
{name:“from amonut”,value:“300”},
{name:“to amonut”,value:“400”},
{名称:“gst”,值:“30”}
];
设温度={
“起始金额”:0,
“至金额”:0,
“商品及服务税”:0
};
设formattedBreakpoints=[];
断点.map((v,k)=>{
(v.name==“from amonut”)?temp.from_amount=v.value:”;
(v.name==“to amonut”)?temp.to_amount=v.value:”;
(v.name==“gst”)?temp.gst=v.value:”;
((k+1)%3==0)?(格式化的断点.push(temp),console.log(temp)):“”;
});
日志(格式化断点)代码>您可以使用将所有属性添加到最后一个对象。每当3的索引(i
)余数为0时,将另一个对象添加到累加器中
const断点=[{“name”:“from amonut”,“value”:“100”},{“name”:“to amonut”,“value”:“200”},{“name”:“from amonut”,“value”:“200”},{“name”:“to amonut”,“value”:“300”{“name”:“gst”,“value”:“20”{“name”:“from amonut”,“value”:“300”{“name”:“to amonut”,“value”:“400”{“name”:“to amonut”,“gst value”:“30”};
const result=断点.reduce((r,{name,value},i)=>{
如果(i%3==0)r.push({});
const key=name.replace(/-/g,'.');
r[r.length-1][key]=值;
返回r;
}, []);
控制台日志(结果)代码>您可以使用将所有属性添加到最后一个对象。每当3的索引(i
)余数为0时,将另一个对象添加到累加器中
const断点=[{“name”:“from amonut”,“value”:“100”},{“name”:“to amonut”,“value”:“200”},{“name”:“from amonut”,“value”:“200”},{“name”:“to amonut”,“value”:“300”{“name”:“gst”,“value”:“20”{“name”:“from amonut”,“value”:“300”{“name”:“to amonut”,“value”:“400”{“name”:“to amonut”,“gst value”:“30”};
const result=断点.reduce((r,{name,value},i)=>{
如果(i%3==0)r.push({});
const key=name.replace(/-/g,'.');
r[r.length-1][key]=值;
返回r;
}, []);
控制台日志(结果)代码>代码中的问题是,您正在对单个对象临时进行变异,并将其推送到结果数组中3次。那么发生了什么:
您正在创建一个对象
在map方法中,您反复对其进行变异,并且在每3次迭代后,您将对该对象的引用设置为结果数组
这里的关键词是参考
。这意味着这是同一个对象。例如:
const result = [];
const obj = {};
obj.a = 'a';
result.push(obj); // => result = [{ a: 'a' }]
obj.b = 'b';
result.push(obj); // => result = [{ a: 'a', b: 'b' }, { a: 'a', b: 'b' }]
试着这样做:
let formattedBreakpoints = [];
for (let i = 0; i < breakpoints.length; i += 3) {
const breakPointOptions = breakpoints.slice(i, i + 3);
formattedBreakpoints.push(breakPointOptions.reduce((result, { name, value }) => {
result[name] = value;
return result;
}, {}));
}
let formattedBreakpoints=[];
for(设i=0;i{
结果[名称]=值;
返回结果;
}, {}));
}
您的代码存在的问题是,您正在对单个对象temp进行变异,并将其推送到结果数组中3次。那么发生了什么:
您正在创建一个对象
在map方法中,您反复对其进行变异,并且在每3次迭代后,您将对该对象的引用设置为结果数组
这里的关键词是参考
。这意味着这是同一个对象。例如:
const result = [];
const obj = {};
obj.a = 'a';
result.push(obj); // => result = [{ a: 'a' }]
obj.b = 'b';
result.push(obj); // => result = [{ a: 'a', b: 'b' }, { a: 'a', b: 'b' }]
试着这样做:
let formattedBreakpoints = [];
for (let i = 0; i < breakpoints.length; i += 3) {
const breakPointOptions = breakpoints.slice(i, i + 3);
formattedBreakpoints.push(breakPointOptions.reduce((result, { name, value }) => {
result[name] = value;
return result;
}, {}));
}
let formattedBreakpoints=[];
for(设i=0;i{
结果[名称]=值;
返回结果;
}, {}));
}
let断点=[
{name:“from amonut”,value:“100”},
{name:“to amonut”,value:“200”},
{名称:“gst”,值:“10”},
{name:“from amonut”,value:“200”},
{name:“to amonut”,value:“300”},
{名称:“gst”,值:“20”},
{name:“from amonut”,value:“300”},
{name:“to amonut”,value:“400”},
{名称:“gst”,值:“30”}
]
设温度={
“起始金额”:0,
“至金额”:0,
“商品及服务税”:0
};
设formattedBreakpoints=[];
断点.map((v,k)=>{
(v.name==“from amonut”)?temp.from_amount=v.value:”;
(v.name==“to amonut”)?temp.to_amount=v.value:”;
(v.name==“gst”)?temp.gst=v.value:”;
((k+1)%3==0)?(格式化的断点。推送(temp),temp={…temp}):“”;
});
日志(格式化断点)代码>
let断点=[
{name:“from amonut”,value:“100”},
{name:“to amonut”,value:“200”},
{名称:“gst”,值:“10”},
{name:“from amonut”,value:“200”},
{name:“to amonut”,value:“300”},
{名称:“gst”,值:“20”},
{name:“from amonut”,value:“300”},
{name:“to amonut”,value:“400”},
{名称:“gst”,值:“30”}
]
设温度={
“起始金额”:0,
“至金额”:0,
“商品及服务税”:0
};
设formattedBreakpoints=[];
断点.map((v,k)=>{
(v.name==“from amonut”)?temp.from_amount=v.value:”;
(v.name==“to amonut”)?temp.to_amount=v.value:”;
(v.name==“gst”)?temp.gst=v.value:”;
((k+1)%3==0)?(格式化的断点。推送(temp),temp={…temp}):“”;
});
日志(格式化断点)非常感谢你。这管用!但是你能告诉我我的密码有什么问题吗?哦!可以但是,当我将temp
推入数组后显示它时,我会在控制台中显示正确的对象