【问题标题】:Hash keys / values as array [duplicate]散列键/值作为数组[重复]
【发布时间】:2012-05-12 00:13:06
【问题描述】:

我找不到 PHP array_keys() / array_values() 的 JavaScript 等效项。

对于不熟悉 PHP 的人,给出以下 JavaScript 哈希:

var myHash = {"apples": 3, "oranges": 4, "bananas": 42}

我怎样才能得到一个键数组,即,

["apples", "oranges", "bananas"]

与值相同的问题,即,

[3, 4, 42]

可以使用jQuery。

【问题讨论】:

标签: javascript hashmap


【解决方案1】:

在ES5 支持的(或垫片) 浏览器中...

var keys = Object.keys(myHash);

var values = keys.map(function(v) { return myHash[v]; });

来自 MDN 的垫片...

【讨论】:

  • @greg0ire:支持的浏览器通常是任何现代浏览器。通常大多数 Chrome 和 Safari 都在使用,Firefox 4+、Opera 10+ (可能更早?) 和 IE9。您可以轻松地填充这两种方法以支持旧版浏览器。
  • @greg0ire:我添加了指向 MDN 提供的垫片的链接。
  • 很好的解决方案,但是代码应该尽可能兼容IE7-8。
  • @greg0ire:包括链接的垫片将使其兼容,但如果您不想要这些,那么 IE7/8 将无法工作。
  • var values = Object.values(myHash); per developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:
var a = {"apples": 3, "oranges": 4, "bananas": 42};    

var array_keys = new Array();
var array_values = new Array();

for (var key in a) {
    array_keys.push(key);
    array_values.push(a[key]);
}

alert(array_keys);
alert(array_values);

【讨论】:

  • +1,但是 for 循环的内部应该包含在检查当前键实际上是相关对象自己的属性(而不是继承的属性)中。否则,在 IE 中,你会得到一些意想不到的键:if (Object.prototype.hasOwnProperty.call(a, key)) {array_keys.push(key);array_values.push(a[key]);}
  • @JAAulde:我不知道任何这样的 IE 问题。枚举对象时。您能否进一步描述该问题?会找到什么键?
  • @amnotiam Crockford 在JSLint.com/lint.html#forin 的 LINT 说明中推荐了它,并引用了他在yuiblog.com/blog/2006/09/26/for-in-intrigue 上写的一篇关于此事的文章
  • @JAAulde Object.prototype 中的成员应该被标记为不可枚举并被“foreach”跳过,但是是的,我相信旧的 IE 实际上可能有这个问题。谢谢。
  • @JAAulde:说实话,我真的不在乎 Crockford 的建议。没有我知道的 IE 问题。唯一的问题是向Object.prototype 添加可枚举属性,这很容易解决/可逆。
【解决方案3】:

第二个答案(在撰写本文时)给出:

var values = keys.map(function(v) { return myHash[v]; });

但我更喜欢使用jQuery自己的$.map:

var values = $.map(myHash, function(v) { return v; });

因为 jQuery 负责跨浏览器的兼容性。而且它更短:)

无论如何,我总是尽可能地发挥功能。单行比循环更好。

【讨论】:

    【解决方案4】:

    【讨论】:

      【解决方案5】:
      function getKeys(obj){
          var keys = [];
          for (key in obj) {
              if (obj.hasOwnProperty(key)) { keys[keys.length] = key; }
          } 
          return keys;
      }
      

      【讨论】:

        【解决方案6】:

        我不知道它是否有帮助,但是“foreach”会遍历所有键:

        for (var key in obj1) {...}
        

        【讨论】:

        • 注意“jquery/prototype”风格的对象:这些库向所有被迭代的对象添加了不同的函数,就好像它们也是键一样......在这种情况下你想使用给定库提供的 Object.each() 函数:api.jquery.com/jQuery.each 有点离题,但有些重要...
        【解决方案7】:

        这里是来自phpjs.org的实现:

        这不是我的代码。我只是在为您指出一个有用的资源。

        【讨论】:

        • 您显示的函数似乎返回的是哈希值而不是数组,或者 {0: "test"} 是 ["test"] 的同义词吗?
        【解决方案8】:

        用途:

        var myHash = {"apples": 3, "oranges": 4, "bananas": 42}
        vals=(function(e){a=[];for (var i in e) a.push(e[i]); return a;})(myHash).join(',')
        keys=(function(e){a=[];for (var i in e) a.push(  i ); return a;})(myHash).join(',')
        console.log(vals,keys)
        

        基本上:

        array=(function(e){a=[];for (var i in e) a.push(e[i]); return a;})(HASHHERE)
        

        【讨论】:

          【解决方案9】:

          这是来自PHP.js library 的array_keys 的一个很好的例子:

          function array_keys (input, search_value, argStrict) {
              // Return just the keys from the input array, optionally only for the specified search_value
          
              var search = typeof search_value !== 'undefined',
                  tmp_arr = [],
                  strict = !!argStrict,
                  include = true,
                  key = '';
          
              for (key in input) {
                  if (input.hasOwnProperty(key)) {
                      include = true;
                      if (search) {
                          if (strict && input[key] !== search_value) {
                              include = false;
                          }
                          else if (input[key] != search_value) {
                              include = false;
                          }
                      }
          
                      if (include) {
                          tmp_arr[tmp_arr.length] = key;
                      }
                  }
              }
          
              return tmp_arr;
          }
          

          array_values (from the same PHP.js library) 也是如此:

          function array_values (input) {
              // Return just the values from the input array
          
              var tmp_arr = [],
                  key = '';
          
              for (key in input) {
                  tmp_arr[tmp_arr.length] = input[key];
              }
          
              return tmp_arr;
          }
          

          【讨论】:

          • 您显示的函数似乎返回的是哈希值而不是数组,或者 {0: "test"} 是 ["test"] 的同义词吗?
          • @greg0ire 它们不是同义词。 {0: "test"} 是Object 的一个实例,而["test"] 是Array 的一个实例。但他们都有成员0,价值"test"。
          • JavaScript 中有对象和数组。您正在谈论的哈希是一个对象。如果您查看带有var tmp_arr = [] 的行,它表明tmp_arr 变量是一个数组([])而不是一个对象({})。所以这两种方法都返回数组。
          • 我之所以这么说是因为您的函数似乎与超现实梦想提出的相同,并且他提供的链接说这两个函数都应该返回哈希值。
          • 这是因为 PHP.js 提供的函数使用内部方法 keys() 和 values() 可能返回对象,因为对于 JavaScript 迭代 { 0 : 'a', 1 : 'b' } 和 ['a', 'b'] 是相同的。我已经更新了上面的函数,以便它们只返回数组。
          猜你喜欢
          • 2011-07-24
          • 2020-02-16
          • 2021-03-03
          • 1970-01-01
          • 1970-01-01
          • 2015-07-01
          • 1970-01-01
          • 2014-09-05
          • 2015-02-03
          相关资源
          最近更新 更多