Javascript 将第二个值插入JSON数组时未定义属性

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');

我正在用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');
            // 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 || ''
      }
    });