Javascript 将第二个值插入JSON数组时未定义属性
我正在用javascript编写以下代码:Javascript 将第二个值插入JSON数组时未定义属性,javascript,json,Javascript,Json,我正在用javascript编写以下代码: var res = [{}]; for (var idx = 0; idx < json.length; idx++) { // if the environment is already entered in the result if (res[idx].env) { sails.log.debug('Environment is in result');
var res = [{}];
for (var idx = 0; idx < json.length; idx++) {
// if the environment is already entered in the result
if (res[idx].env) {
sails.log.debug('Environment is in result');
// if the current inspected value has been deployed later than the stored one
if (res[idx].updatedAt < json[idx].updatedAt) {
sails.log.debug('Updating the value in the result');
//res[json[idx].lifeCycle] = JSON.parse('{"'+json[idx].version+'":"'+json[idx].updatedAt+'"}');
res.env = json[idx].lifeCycle;
res.ver = json[idx].version;
res.updatedAt = json[idx].updatedAt;
}
} else {
// it is the first time we are adding to the result the component version (for the given environment)
if (json[idx].lifeCycle) {
//add the value in result
res[idx].env = json[idx].lifeCycle || '';
res[idx].ver = json[idx].version || '';
res[idx].updatedAt = json[idx].updatedAt || '';
}
else {
sails.log.debug('Lifecycle is null or empty');
}
}
}
return res;
在这里,IDX等于1(第二次绕过for循环)
当我尝试将第二个值插入“res”时,我得到错误:
TypeError: Cannot read property 'env' of undefined
在第一次通过for循环之后,res就好像不存在了
谁能帮我一下,让我知道为什么会这样
非常感谢 如果你查看你的
res
数组,它只有一个元素,这是一个空对象。
这意味着:
res[0]/->{}
及
res[1]/->未定义
简单解决方案(更改代码最少的解决方案)
尝试访问数组中的res[idx]
元素时,只需创建一个新对象
您的代码如下所示
if (json[idx].lifeCycle) {
res[idx] = res[idx] || {}; // if the index `idx` is not set, just init it to an empty object
res[idx].env = json[idx].lifeCycle || '';
res[idx].ver = json[idx].version || '';
res[idx].updatedAt = json[idx].updatedAt || '';
}
稍好一点的解决方案
或者,您甚至可以简化一点代码,在每个循环中创建一个新对象,并将其推送到res
数组中。如果执行此操作,还必须将res
数组初始化为空数组var res=[]
:
if (json[idx].lifeCycle) {
res.push({
env: json[idx].lifeCycle || '',
ver: json[idx].version || '',
updatedAt: json[idx].updatedAt || ''
})
}
这样,如果数组中是否有元素,就不需要处理特殊情况,只需对每个循环进行相同的处理
最佳解决方案(IMO):函数式编程FTW
不确定是否了解数组函数,如array.prototype.map
。这是一个函数,允许您在数组的每个元素上映射函数,并将其转换为转换后的元素。它创建一个由转换后的元素组成的新数组
下面是使用难以置信的map
方法时代码的外观:
var res = json
.map(function (element) {
return {
env: json[idx].lifeCycle || '',
ver: json[idx].version || '',
updatedAt: json[idx].updatedAt || ''
}
});
如果我在res
中的回答正确,那么您将拥有与代码生成的值相同的值
我删除了第一个条件if(res[idx].env)
,我认为它从来都不是true
,因为res[idx]
要么是未定义的
,要么是空对象(但我可能在这一点上错了)
无论如何,如果您觉得此解决方案很酷,请务必查看MDN:)上的
map
、filter
和reduce
上的文档。您是否尝试将调试器放在else块中。在for循环执行期间,您将能够看到res是否存在。它可能不会完全回答您的问题,但可能会帮助您更好地理解问题。请同时添加对象。“…到JSON数组中”JSON是用于数据交换的文本表示法。如果您处理的是JavaScript源代码,而不是字符串,那么您就不是在处理JSON。您的问题中没有JSON<你的问题中的code>json是一个对象数组<if(res[idx].env){…}
分支中的code>res.env看起来至少可疑。这成功了!非常感谢。把res[idx]=res[idx]|{};我很乐意。顺便说一句,我刚刚添加了一个新的更简单的解决方案,您可能想检查一下您是否好奇,是否想尝试新的做事方式:)如果您喜欢上一个解决方案,请告诉我是的,效果很好,您的最新解决方案是“更干净”。非常感谢。
var res = json
.map(function (element) {
return {
env: json[idx].lifeCycle || '',
ver: json[idx].version || '',
updatedAt: json[idx].updatedAt || ''
}
});