【问题标题】:Generating string of code from properties of nested objects从嵌套对象的属性生成代码字符串
【发布时间】:2017-05-26 11:23:47
【问题描述】:

我有一个按钮可以“编译”一个将在终端中使用的命令。
保持解释简单:
行里面有六个输入,行是一个对象,里面的输入是属性,输入的值是属性的值。 从输入数据写入终端命令。

JSON 对象如下所示

formsData = {
  transfer_1: {
    host_1: "t1_host1",
    host_2: "t1_host2",
    user_1: "t1_user1",
    user_2: "t1_user2",
    password_1: "t1_password1",
    password_2: "t1_password2"
  },
  transfer_2: {
    host_1: "t2_host1",
    host_2: "t2_host2",
    user_1: "t2_user1",
    user_2: "t2_user2",
    password_1: "t2_password1",
    password_2: "t2_password2"
  }
}

我想将 transfer_1 中的所有值放入终端的命令中,如下所示:

./imapsync --host1 t1_host1 --user1 t1_user1 --password1 t1_password1 
--host2 t1_host2 --user2 t1_user2 --password2 t1_password2;

我想做这样的事情:

var command = "";
for (i = 0; i < Object.keys(formsData).length; i++) {
    command += 
    "./imapsync_bin_Darwin " +
    "--host1 " + formsData[i].host_1 + " " +
    "--user1 " + formsData[i].user_1 + " " +
    "--password1 " + formsData[i].password_1 + " " +
    "--host2 " + formsData[i].host_2 + " " +
    "--user2 " + formsData[i].user_2 + " " +
    "--password2 " + formsData[i].password_2 + "; ";
}
console.log(command);

但我得到的只是

Uncaught TypeError: Cannot read property 'host_1' of undefined

编辑: 非常感谢您的快速回答!多亏了你们,它现在可以工作了,我希望我现在变得更聪明了:-)

【问题讨论】:

  • 因为你没有数组,

标签: javascript jquery arrays json object


【解决方案1】:

因为你需要通过键名来获取它,就像那样(快速示例);

var formsData = {
  transfer_1: {
    host_1: "t1_host1",
    host_2: "t1_host2",
    user_1: "t1_user1",
    user_2: "t1_user2",
    password_1: "t1_password1",
    password_2: "t1_password2"
  },
  transfer_2: {
    host_1: "t2_host1",
    host_2: "t2_host2",
    user_1: "t2_user1",
    user_2: "t2_user2",
    password_1: "t2_password1",
    password_2: "t2_password2"
  }
};

var command = "",
    keys = Object.keys(formsData);

for (i = 0; i < keys.length; i++) {
    command += 
    "./imapsync_bin_Darwin " +
    "--host1 " + formsData[keys[i]].host_1 + " " +
    "--user1 " + formsData[keys[i]].user_1 + " " +
    "--password1 " + formsData[keys[i]].password_1 + " " +
    "--host2 " + formsData[keys[i]].host_2 + " " +
    "--user2 " + formsData[keys[i]].user_2 + " " +
    "--password2 " + formsData[keys[i]].password_2 + "; ";
}
console.log(command);

【讨论】:

  • @Jonasw 是的,你说得对,乔纳斯,希望 OP 会这样使用它:)
  • 我从早上 8 点就开始工作了,现在是下午 1:30。你是男人!!我将如何实现 keys.length?
  • @CasperEngl 好吧,基本上,Jonas 的意思是(据我所知)使用 for (i = 0; i &lt; keys.length; i++) 而不是 for 字符串中的当前内容 :)
  • @DanilGholtsman 谢谢,这也有效。这是我第一次以这种方式处理对象,感谢您的启发:-)
【解决方案2】:

试试这个,

var formsData = {
  transfer_1: {
    host_1: "t1_host1",
    host_2: "t1_host2",
    user_1: "t1_user1",
    user_2: "t1_user2",
    password_1: "t1_password1",
    password_2: "t1_password2"
  },
  transfer_2: {
    host_1: "t2_host1",
    host_2: "t2_host2",
    user_1: "t2_user1",
    user_2: "t2_user2",
    password_1: "t2_password1",
    password_2: "t2_password2"
  }
};
var command = "";
var keys=Object.keys(formsData);
for (var i=0,l=keys.length;i<l;i++) {
    t=formsData[keys[i]];
    command += 
    "./imapsync_bin_Darwin " +
    "--host1 " + t.host_1 + " " +
    "--user1 " + t.user_1 + " " +
    "--password1 " + t.password_1 + " " +
    "--host2 " + t.host_2 + " " +
    "--user2 " + t.user_2 + " " +
    "--password2 " + t.password_2 + "; ";
}
console.log(command);

【讨论】:

    【解决方案3】:

    您混淆了数组和对象。

    formsData 是一个对象,但您使用它就像一个数组(尝试获取 length 并使用索引对其进行迭代)。使用for (var key in formsData)hasOwnProperty 之后检查对象。

    像这样(未经测试,但你明白了):

    var command = "";
    for (var key in formsData) {
        if (!formsData.hasOwnProperty(key)) continue;
        command += 
        "./imapsync_bin_Darwin " +
        "--host1 " + formsData[key].host_1 + " " +
        "--user1 " + formsData[key].user_1 + " " +
        "--password1 " + formsData[key].password_1 + " " +
        "--host2 " + formsData[key].host_2 + " " +
        "--user2 " + formsData[key].user_2 + " " +
        "--password2 " + formsData[key].password_2 + "; ";
    }
    console.log(command);
    

    您可能希望在第一个键(“transfer_1”)之后中断以获得您真正想要的东西(“将 transfer_1 中的所有值放入命令中”)。所以你实际上可以不用循环,只分配var key = "transfer_1"

    对于更短的方法,您可以像这样做得更漂亮:

    var formsData = {
      transfer_1: {
        host_1: "t1_host1",
        host_2: "t1_host2",
        user_1: "t1_user1",
        user_2: "t1_user2",
        password_1: "t1_password1",
        password_2: "t1_password2"
      },
      transfer_2: {
        host_1: "t2_host1",
        host_2: "t2_host2",
        user_1: "t2_user1",
        user_2: "t2_user2",
        password_1: "t2_password1",
        password_2: "t2_password2"
      }
    }
    
    var command = "./imapsync_bin_Darwin ";
    for (var key in formsData.transfer_1) {
        if (!formsData.transfer_1.hasOwnProperty(key)) continue;
        command += "--" + key + " " + formsData.transfer_1[key] + " ";
    }
    command = command.slice(0,-1) + ";";
    console.log(command);
    
     

    【讨论】:

      【解决方案4】:

      循环中的i 是计数键,formsData 中有 2 个键。所以i 取值 0 和 1。当你执行 formsData[i] 时,实际上是在执行 formsData[0]formsData[1],这两者都不存在。这就是你不确定的原因。

      您可能想试试formsData[keys[i]]。这样keys[i] 将采用值“transfer_1”和“transfer_2”,因此formsData["transfer_1"].host_1 突然变为有效。

      【讨论】:

        猜你喜欢
        • 2019-07-21
        • 2021-10-06
        • 2014-04-11
        • 1970-01-01
        • 1970-01-01
        • 2019-10-31
        • 2013-12-04
        • 1970-01-01
        • 2021-06-24
        相关资源
        最近更新 更多