如何在循环中存储每个对象?

问题描述

我想做的就是处理JSON数据并在退出for循环后存储每个对象。但是,obj每次迭代都会更新,因此objectArray在其中的每个元素中仅保留David的信息。我希望objArray保留每个已处理的JSON对象(下面的屏幕截图)。 JSON流程是存储搜索用户ID和名称并将其存储在objectArray中。有人可以帮我弄清楚如何将每个对象存储在objectArray中吗?预先谢谢你。

const obj = {};
var objectArray = [];
var data = [
    {
        "userId": "123","name": "John","phoneNumber": "123-456-6789"
    },{
        "userId": "345","name": "Summer","phoneNumber": "535-631-9742"
    },{
        "userId" : "789","name": "David","phoneNumber": "633-753-1352"
    }
]

var dataLen = data.length;
var people = data;

createkeyvalue = ((key,value) => {
    var temp = {};
    temp["value"] = value;
    obj[key] = temp;
});


while (dataLen > 0) {
    for (let [key,value] of Object.entries(data[0])) {
        switch(key) {
            case 'userId':
                createkeyvalue(key,value);
                break;
            case 'name':
                createkeyvalue(key,value);
                break;
            default:
        }
    }
    
    objectArray.push(obj);
    data.shift();
    dataLen -= 1;

    
}

enter image description here

解决方法

您可以使用简单的forEach()循环来创建并推送新对象到objArray数组。

const data = [
  {
    "userId": "123","name": "John","phoneNumber": "123-456-6789"
  },{
    "userId": "345","name": "Summer","phoneNumber": "535-631-9742"
  },{
    "userId": "789","name": "David","phoneNumber": "633-753-1352"
  }
];

let objArray = [];

data.forEach(person => {
  objArray.push({
    userId: { value: person.userId },name: { value: person.name }
  });
});

console.log(objArray);

,

正如我们的朋友Kevin BZcoop98所说,使用forEach函数而不是map函数更合适:

data.forEach(elem => {
    objectArray.push({
        userId: { value: elem.userId },name: { value: elem.name }
    });
})
,

您看到的错误是由于JavaScript中的一个概念(通常是编程)“ passing by reference”引起的。
JS中的对象不是作为完整的数据组传递,而是作为地址传递到该数据的存储位置。由于对象可以变得很大,因此可以节省大量开销。

但是,在您的情况下,您正在遇到一种使您绊倒的方法。由于obj实际上是通过引用而不是通过值传递的,因此您实际上.push将3个相同的地址obj的)复制到{{ 1}},而不是3个不同的数据集。

解决此问题的更好方法是使用称为map()的JS Array函数。 MDN可能最好地解释了此功能:

objectArray方法创建一个新数组,其中填充了对调用数组中每个元素调用提供的函数的结果。

您可以像这样在map()数组上使用它:

data
var objectArray = [];
var data = [{
    "userId": "123","phoneNumber": "633-753-1352"
  }
]

objectArray = data.map(dataEl => ({
  userId: {
    value: dataEl.userId,},name: {
    value: dataEl.name,}));

console.log(objectArray);