【问题标题】:Javascript array object arraysJavascript数组对象数组
【发布时间】:2015-08-07 21:52:06
【问题描述】:

这听起来像是一个愚蠢的问题,但它就是这样。我有一个像这样格式化的 js 数组

 var locationID = [
              { ID: "ID1", location: "location1" },
              { ID: "ID2", location: "location2" },
              { ID: "ID3", location: "location3" },
   ];

我正在尝试遍历数组

for(i = 0; i < locationID.length;i++){
   var object = locationID[i];
}

我想从内部数组中获取两个元素,以便获取 ID 和位置。例如,我会通过object[0]object["ID"] 来执行此操作吗?

还有一种更有效的方法来做我需要做的事情,比如 for each 循环或类似的事情。

【问题讨论】:

  • object["ID"] 和 object["location"] 应该可以正常工作,真的不能比这更有效,只是其他方法可以做到这一点,毕竟你需要遍历所有
  • 你不是要比较object['ID'] == ID吗?

标签: javascript arrays


【解决方案1】:

使用object.IDobject['ID']

对象 {} 在 JavaScript 中是关联的或命名的数组。 (在许多语言中也称为地图。它们由字符串索引(在这种情况下)。

数组[],由整数索引,从0 开始,一直到n-1,其中n 是数组的长度。

如果您想以编程方式遍历每个对象中的所有(键、值)对,可以使用this method

引号(字符串文字)

重申我在下面关于单引号和双引号的评论:

如果您在[] 内部谈论,则不[,它们不重要]。 JavaScript treats single quotes and double quotes pretty much the same。两者都表示 字符串文字。有趣的是,你可以在里面使用单引号 双引号或反之亦然:"I wanted to say 'Hello world!'" 将是 一个(单个)有效字符串,但'But I accidentally said "Goodbye" 也是如此。

【讨论】:

  • @RickHitchcock 准确性提高。
  • 为避免混淆,我删除了我的评论。对此感到抱歉
  • 而对于它的价值,我有点想参考this
  • 在我的情况下是单引号和双引号之间的区别
  • @sircapsalot 这仅适用于具有特殊字符(无效标识符)的属性。您应该避免在“常规”属性中使用这些字符,例如您自己定义的那些。保持Objectsassociative arrays 的用法在逻辑上分开。
【解决方案2】:

这是一个基于 Nicholas Zackas(YAHOO 性能主管)的书的优化循环。我正在执行缓存数组长度,以防止在循环的每次迭代中重新评估数组长度。请检查 jsperf.com。此外,本机循环总是比基于方法的循环 jQuery.each 和 Array.prototype.forEach 快。 ie8以下的浏览器也支持这个

    var currentItem,
        locationInfo = [
          { ID: "ID1", location: "location1" },
          { ID: "ID2", location: "location2" },
          { ID: "ID3", location: "location3" },
        ];

    for (var i = 0, len = locationInfo.length; i < len; i++) {
        currentItem = locationInfo[i];

        console.log(currentItem.ID);//I prefer this because it shrinks down the size of the js file
        console.log(currentItem["ID"]);
    }

【讨论】:

  • 虽然您确实在“优化”循环,但这种微优化往往会使代码混乱,让程序员感到困惑,并且带来的性能优势可以忽略不计。此外,[].lengthNumber,而不是Function,所以我看不到缓存该值将如何提高性能。最后,使用 . 表示法而不是 [] 将 JavaScript 缩小 3 个字符是不必要的。此时最好缩小代码。
  • @Shadowen 框架如 jQuery 使用相同的策略。你是在暗示他们做错了吗?性能增益总是一种增益;)
  • @Shadowen,查看高性能 JavaScript 第 63 页。由 Nicholas Zackas 撰写。如果你比他好,那我同意;)
  • 你只是在谷歌搜索。我代表作者争论:) 我会重复我的问题。你比他好吗?
  • 我使用 jsperf 作为实验证据。毕竟,我们关心的是真实世界的表现,而不是作者所说的最好。此外,谷歌是一个很好的信息来源。有点像StackOverflow
【解决方案3】:

当您运行循环时,您已经拥有的将返回 JSON 中的每个对象。你需要的是类似

for(i = 0; i < locationID.length;i++){
   var object = {locationID[i].ID, locationID[i].location};
}

记住对象的属性是通过它们的键来访问的,因为它们是键值对。

【讨论】:

  • object = locationID[i]; 已经在做同样的事情时,他为什么还要这样做?
  • 我的意思是用它来替换他当前拥有的循环,它会为循环的每次迭代返回一个对象
【解决方案4】:

就速度而言,For 循环将是您的最佳选择,以下是使用 forEach (IE 9+) 的方法

locationID.forEach(function(location, i){
    console.log(location['ID'])
    console.log(location['location'])
});

jQuery 让它更简单一些,但运行速度更慢

$.each(array, function(i, item){

});

http://jsperf.com/for-vs-foreach/75

这里还有一个有用的链接:For-each over an array in JavaScript?

【讨论】:

    【解决方案5】:

    您可以使用 forEach 方法,让您的代码更简洁。

    forEach

    locationID.forEach(function(elm){
      //Here, elm is my current object
      var data = elm;
      console.log(data.ID):
      console.log(data.location);
    });
    

    编辑: 那么对于第二个问题,您应该使用 filterma​​p 方法。

    function findNamebyID(id){
      //Filter by id and map the data to location
      return locationID.filter(function(elm){
        return elm.ID === id;
      }).map(function(elm){
        return elm.location;
      })
    }
    

    【讨论】:

      【解决方案6】:

      某事:

      var location = locationID.reduce(function(ob, cur) {
      ob[cur.ID] = cur.location;
      return ob;
      }, {});
      

      你得到的结果是:

      Object {ID1: "location1", ID2: "location2", ID3: "location3"}
      

      你能做到的意思:

      location.ID1 // location1
      location.ID2 // location2
      ...
      

      【讨论】:

      • 这似乎是不必要的复杂。而且很难理解,尤其是对于任何类型的初学者。
      • 人们应该检查 reduce,因为它是我们日常使用的所有其他功能的核心,如 map、foreach 等。它比使用 for 简单得多。
      • 我认为您希望 map 用于您的方法,但您可能想再次阅读原始问题。我不确定您解决的问题是否与作者的意图完全不同..
      【解决方案7】:

      您的循环的替代方法是使用 JavaScript for (.. in ..),因为您并没有真正使用迭代器;它只是增加了绒毛

      for(i = 0; i < locationID.length;i++){
         var object = locationID[i];
      }
      

      可以写成:

      for (item in locationID) {
        var object = item;
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多