2012-05-02 143 views
51

我无法找到PHP array_keys()/array_values()哈希键/值数组

的JavaScript的等价物的人不熟悉PHP给出下面的JS散:

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

我怎样才能得到钥匙的数组,即

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

与价值观相同的问题,即

[3, 4, 42] 

jQuery可以使用。

+0

可能重复[获取对象的键的数组](http://stackoverflow.com/questions/8763125/get-array-的对象键)和[如何获得一个Javascript对象的所有属性值(不知道键)?](http://stackoverflow.com/questions/7306669/how-to-get-all-properties-values -of-A-JavaScript的对象,而无需知-的键)。 –

回答

44
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); 
+8

+1,但是'for'循环的内部应该包含在一个检查中,即当前键实际上是Object自己的属性(而不是继承的属性)。否则,在IE中,你可以得到一些意想不到的键:'if(Object.prototype.hasOwnProperty.call(a,key)){array_keys.push(key); array_values.push(a [key]);}' – JAAulde

+0

@ JAAulde:我不知道任何这样的IE问题。枚举对象时。你能否进一步描述这个问题?什么钥匙将被发现? – 2012-05-02 13:58:34

+0

@amnotiam Crockford在他的LINT说明中推荐它,网址是http://www.JSLint.com/lint.html#forin,并参考他在http://yuiblog.com/blog/2006/09/上撰写的文章26/for-in-intrigue/ – JAAulde

59

在ES5支持(或垫高)浏览器...

var keys = Object.keys(myHash); 

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

从MDN垫片...

+0

+1,你能否详细说明这些浏览器是什么? – greg0ire

+0

@ greg0ire:支持的浏览器通常是任何现代浏览器。一般来说,大多数使用的Chrome和Safari,Firefox 4 +,Opera 10+ *(可能更早?)*和IE9。您可以轻松地使用这两种方法来支持传统浏览器。 – 2012-05-02 14:00:26

+0

@ greg0ire:我添加了由MDN提供的垫片的链接。 – 2012-05-02 14:07:51

1

不知道是否有帮助,但 “的foreach” 经过所有键: 为(在OBJ1 VAR键){...}

+0

+1,它确实有助于 – greg0ire

+1

当心“的jQuery /原型”风格的对象:这些库全部添加不同的功能它正在通过迭代,好像他们是钥匙太...在这种情况下,对象要使用由给定的库提供的Object.each()函数: http://api.jquery.com/jQuery.each/ 有点偏离主题,但有些重要的... – Igor

3
function getKeys(obj){ 
    var keys = []; 
    for (key in obj) { 
     if (obj.hasOwnProperty(key)) { keys[keys.length] = key; } 
    } 
    return keys; 
} 
+0

+1与hasOwnProperty适当的检查(虽然我更愿意把它关闭的Object.prototype) – JAAulde

1

这里有从phpjs.org实现:

这是不是我的代码,我只是把你指向一个有用的资源。

+1

你正在展示的功能似乎不是返回数组的哈希值或者是{ 0:“test”}是否为[“test”]的同义词? – greg0ire

0

这里是从array_keysPHP.js library一个很好的例子:

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_valuesfrom 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

您显示的函数似乎返回散列而不是数组,或者是{0:“test”}是[“test”的同义词]? – greg0ire

+0

@ greg0ire它们不是同义词。 '{0:'test“}'是'Object'的一个实例,而'[”test“]'是'Array'的一个实例。但是它们都具有''test''值的成员'0'。 – Imp

+0

JavaScript中有对象和数组。你谈论的哈希是一个对象。如果你看看'var tmp_arr = []'这一行,它表明'tmp_arr'变量是一个数组('[]'),但不是一个对象('{}')。所以两个方法都返回数组。 – VisioN

0
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) 
13

第二个答案(在写作的时候)给出:

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

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

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

由于jQuery负责c ross-browser兼容性。加上它更短:)

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

相关问题