【问题标题】:values getting duplicated when an object is pushed into array - javascript [duplicate]将对象推入数组时值重复 - javascript [重复]
【发布时间】:2021-08-29 10:52:37
【问题描述】:

我正在执行一个 for 循环,以便将对象推送到数组中。但最终的数组输出得到的是相同的重复值。

这是我的代码:

let jsuOrderData = [];
let jsuOrderSet = {
  jsuOrder: '',
  itemNo: '',
};

let response = [{
    itemno: 1,
    jsuordref: 'JSU21628'
  },
  {
    itemno: 1,
    jsuordref: 'JSU21729'
  },
];
console.log(response);

for (let i = 0; i < response.length; i++) {
  console.log(response[i].jsuordref);
  jsuOrderSet.jsuOrder = response[i].jsuordref;
  jsuOrderSet.itemNo = response[i].itemno;
  jsuOrderData.push(jsuOrderSet);
}
console.log(jsuOrderData);

我得到的输出是

[{"itemNo": 1, "jsuOrder": "JSU21729"}, {"itemNo": 1, "jsuOrder": "JSU21729"}]

而不是预期的输出

[{"itemNo": 1, "jsuOrder": "JSU21628"}, {"itemNo": 1, "jsuOrder": "JSU21729"}]

谁能告诉我哪里错了?请...

【问题讨论】:

    标签: javascript arrays reactjs react-native object


    【解决方案1】:

    这是因为当您将jsuOrderSet 推入jsuOrderData 时,您并未将对象的副本传递到数组中。相反,您将“引用”传递给jsuOrderSet。因此,当您更改 jsuOrderSet 并再次将其推入数组时,您只是将相同的引用推入数组中,一遍又一遍——因此值将全部相同,设置为您设置的任何值 jsuOrderSet持续。为了解决这个问题,将jsuOrderSet 的声明移动到for 循环中,这样每次都是不同的对象引用,如下所示:

    let response = [{
        itemno: 1,
        jsuordref: 'JSU21628'
      },
      {
        itemno: 1,
        jsuordref: 'JSU21729'
      },
    ];
    
    jsuOrderData = [];
    for (let i = 0; i < response.length; i++) {
      let jsuOrderSet = {
        jsuOrder: '',
        itemNo: '',
      };
      console.log(response[i].jsuordref);
      jsuOrderSet.jsuOrder = response[i].jsuordref;
      jsuOrderSet.itemNo = response[i].itemno;
      jsuOrderData.push(jsuOrderSet);
    }
    console.log(jsuOrderData);

    这里有一个清晰的方式来展示这个“参考”的东西是如何与一个更通用的例子一起工作的:

    let obj = {
      val: 1
    };
    let arr = [];
    
    for (let i = 0; i < 5; ++i) {
      arr.push(obj);
    }
    
    // Every item will have val: 1
    console.log(JSON.stringify(arr));
    
    // However, if we change obj.val to 2...
    obj.val = 2;
    
    // Because the array stores references to obj
    // and not copies of obj when obj was pushed into
    // the array, the val attribute will have updated
    // for every object in the array, despite the fact that
    // we haven't directly changed the array at all!
    console.log(JSON.stringify(arr));

    【讨论】:

    【解决方案2】:

    或者你可以使用这个。

    let jsuOrderSet = {};
    
    let response = [
        {itemno: 1, jsuordref: 'JSU21628'},
        {itemno: 1, jsuordref: 'JSU21729'},
    ];
    
    let jsuOrderData = [];
    
    for (let i = 0; i < response.length; i++) {
      let obj = {jsuordref : response[i].jsuordref,  itemno: response[i].itemno};
      jsuOrderData.push(obj);
    }
    console.log(jsuOrderData);
    

    【讨论】:

      猜你喜欢
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2017-10-16
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多