【问题标题】:javascript Collection of an object accessible by key [closed]可通过键访问的对象的 javascript 集合 [关闭]
【发布时间】:2017-02-07 16:00:49
【问题描述】:

如何在 javascript 中实现这一点??

People[key1][0].FirstName = "First1-k1";
People[key1][0].LastName = "Last1-k1";
People[key1][1].FirstName = "First2-k1";
People[key1][1].LastName = "Last2-k1";
People[key2][0].FirstName = "First1-k2";
People[key2][0].LastName = "Last1-k2";
People[key2][1].FirstName = "First2-k2";
People[key2][1].LastName = "Last2-k2";

或许:

People[key2].Index[1].LastName = "Last2-k2";

其他说明:

SomeObject["somekey"][0].FirstName = "whatever";
SomeObject["somekey"][1].FirstName = "whatever";
SomeObject["someotherkey"][0].FirstName = "whatever";
SomeObject["someotherkey"][1].FirstName = "whatever";

谢谢

【问题讨论】:

  • key1 是一个变量(如key2,你可以命名它......)。它的价值是什么?
  • 你的意思是var people = { "key1":{ "firstname:"First1-k1","LastName":"Last1-k1"}, "key2" : { ...... }} 那么people["key1"] 将获得key1 的FirstName 和LastName 还是var families = { "fam1": [{ "firstname:"First1-k1","LastName":"Last1-k1"}, { "firstname:"First1-k2","LastName":"Last1-k2"}]} 然后people["fam1"][1] 将获得fam1 编号1 的FirstName 和LastName
  • 我需要在 People[key1] 以及 People[key2]、People [key3]...等中放置一组行。可能类似于:People[thekey].FirstName[0], People[thekey].FistName[1]..etc
  • 所以 People[key1] 和 key2 和 key3...等内部会有多行。我说key1,key2只是例子。这些键实际上更像是“10”、“12”、“124”……它们是将转换为文本的 ID 号。
  • 是的,@mplungjan....就像你所说的最后一部分...people["fam1"][1] 将获得 fam1 编号 1 的 FirstName 和 LastName

标签: javascript arrays object collections key


【解决方案1】:

当同时使用属性和索引时,您说的是对象(具有属性)和数组(具有索引)。

您的初始语法:People[key1],意味着People 是一个数组,其中key1 是一个包含非负数的变量,或者People 是一个对象,其中key1 是一个字符串用作对象属性的名称。

所以,你可以:

var People = ["John","Paul","Ringo","George"];
     var key1 = 3;  // Arrays use non-negative numbers as indexes
     console.log(People[key1]);  // "George"

或者,您可以:

var People = {
        first:"John",
        last: "Lennon"
     }

     var key1 = "first";  // Objects use strings as property names
     console.log(People[key1]);  // "John"

现在,如果我们继续您的代码:People[key1][0],您指出key1 应该用数字索引,这意味着People[key1] 应该返回一个数组。这意味着People 可以是一个包含数组的数组,也可以是一个以数组为属性的对象:

带有嵌套数组的数组:

     var People = [
       ["John","Paul","Ringo","George"],
       ["Moe","Larry","Curly","Shemp"]
     ];

     var key1 = 1;
     console.log(People[key1][0]);  // "Moe"

以数组作为属性值的对象:

     var People = {
       Beatles: ["John","Paul","Ringo","George"],
       ThreeStooges: ["Moe","Larry","Curly","Shemp"]
     };

     var key1 = "Beatles";
     console.log(People[key1][0]);  // "John"

最后,当我们添加您的最后一段语法时:People[key1][0].FirstName,我们可以看到People[key1][0] 必须返回一个对象,因为您提供了一个要访问的属性名称,因此最终结构仍然可以使用数组或对象,但可能如下所示:

具有嵌套数组的数组,其中包含具有属性的对象:

var People = [
       [
          { firstName: "John" },
          { firstName: "Paul"} ,
          { firstName: "Ringo"} ,
          { firstName: "George"}
       ],
       [
          { firstName:"Moe", lastName: "Stooge" },
          { firstName: "Larry", lastName: "Stooge" },
          { firstName: "Curly", lastName: "Stooge" },
          { firstName:"Shemp", lastName: "Stooge" }
       ]
     ];

     var key1 = 1;
     console.log(People[key1][0].firstName);  // "Moe"

     People[key1][0].firstName = "First-K2";
     console.log(People[key1][0].firstName);  // "First-K2"

以数组作为属性值的对象,存储具有属性的对象:

var People = {
       Beatles: [
          { firstName: "John" },
          { firstName: "Paul"} ,
          { firstName: "Ringo"} ,
          { firstName: "George"}
       ],
       ThreeStooges: [
          { firstName:"Moe", lastName: "Stooge" },
          { firstName: "Larry", lastName: "Stooge" },
          { firstName: "Curly", lastName: "Stooge" },
          { firstName:"Shemp", lastName: "Stooge" }
       ]
     };

     var key1 = "Beatles";
     console.log(People[key1][0].firstName);  // "John"

     People[key1][0].firstName = "First-K2";
     console.log(People[key1][0].firstName);  // "First-K2"

现在,虽然您的语法可能意味着两种不同的结构都可以工作,但您确实需要花一些时间从内而外地考虑这一点。您似乎将具有firstName 属性的对象作为结构中最深的构造,但是从那里向外工作,您似乎只是在没有任何特殊原因的情况下添加层。具有firstName 属性的对象应该是可枚举的吗?如果是这样,将它们放在一个数组中是有意义的。但是,为什么要进一步包装它们呢?你需要做出决定。

【讨论】:

  • 非常感谢@Scott Marcus!你提到的最后一部分代码正是我想要的。很难解释为什么我需要这种方式。它是我正在做的 AngularJS 应用程序的一部分。实际上人名与我的代码无关,我只是以它为例。实际对象看起来更像:OptionsLevel1[OptionSubtypeID][index].OptionIDOptionsLevel1[OptionSubtypeID][index].OptionName。解释整个事情需要很长时间......但无论如何,谢谢!
  • @Hawker 欢迎您。请不要忘记投票并将我的帖子标记为答案。祝你好运!
  • 出于某种原因,由于我是使用 stackoverflow 的新手,它不会让我的“赞成票”显示出来。以及如何将其标记为已回答?另外,这个问题被标记为等待......这让我很烦恼。你显然理解了这个问题,为什么因为其他几个人不理解而被搁置?
  • 好的,所以我没有看到复选标记...大声笑...我继续将您的答案标记为正确答案@Scott Marcus。
猜你喜欢
  • 2017-11-17
  • 2016-05-18
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2013-09-02
  • 2013-12-15
  • 1970-01-01
相关资源
最近更新 更多