如何解决如何在循环中存储每个对象?
我想做的就是处理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;
}
解决方法
您可以使用简单的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 B和Zcoop98所说,使用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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。