【问题标题】:How to Store Each Object in Loop?如何将每个对象存储在循环中?
【发布时间】:2020-12-01 07:02:20
【问题描述】:

我想做的是处理 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;

    
}

【问题讨论】:

  • data 已经是人员对象数组。您希望新数组有什么不同?
  • 我不太明白你的问题。您能否对其进行编辑/更新,以便显示所需的结果?
  • 这里应该发生什么?目前,您将 same 对象 obj 多次添加到同一个数组中。所以你会得到objArray,它多次包含同一个对象(不重复)。
  • obj 通过引用而不是值来保留属性

标签: javascript arrays for-loop object


【解决方案1】:

您可以使用简单的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);

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。答案是固定的。
    【解决方案3】:

    您看到的错误是由于 JavaScript(以及一般编程)中称为“passing by reference”的概念造成的。
    JS 中的对象不是作为整个数据组传递,而是作为地址传递到存储数据的位置。这样可以节省大量开销,因为对象可能会变得非常大。

    但是,在您的情况下,您遇到了一种可能会绊倒您的方式。由于obj 确实是通过引用而不是值传递,所以您实际上是.push 将相同地址obj)的3 个副本复制到objectArray,而不是3 个不同的集合数据。

    解决此问题的更好方法是使用名为 map() 的 JS 数组函数。这个函数可能最好用 MDN 来解释:

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

    您可以像这样在 data 数组上使用它:

    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"
      }
    ]
    
    objectArray = data.map(dataEl => ({
      userId: {
        value: dataEl.userId,
      },
      name: {
        value: dataEl.name,
      },
    }));
    
    console.log(objectArray);
    .as-console-wrapper {
      max-height: 100% !important;
    }

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2019-10-02
      • 2021-02-27
      • 2019-07-26
      • 2023-03-25
      • 2017-01-15
      相关资源
      最近更新 更多