Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Object_Ecmascript 6 - Fatal编程技术网

Javascript 创建对象数组时遇到问题

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

我有一个数组,我想选取其中的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”},
{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
    推入数组后显示它时,我会在控制台中显示正确的对象