Javascript 哈希键/值作为数组

Javascript 哈希键/值作为数组,javascript,hashmap,Javascript,Hashmap,我找不到PHP的JavaScript等价物array\u keys()/array\u values() 对于不熟悉PHP的人,请提供以下JavaScript哈希: var myHash = {"apples": 3, "oranges": 4, "bananas": 42} 如何获取一组密钥,即 ["apples", "oranges", "bananas"] 与值相同的

我找不到PHP的JavaScript等价物
array\u keys()
/
array\u values()

对于不熟悉PHP的人,请提供以下JavaScript哈希:

var myHash = {"apples": 3, "oranges": 4, "bananas": 42}
如何获取一组密钥,即

["apples", "oranges", "bananas"]
与值相同的问题,即

[3, 4, 42]
jQuery可以在支持(或填充)的浏览器中使用。

var keys = Object.keys(myHash);

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

来自MDN的垫片


我不知道它是否有用,但“foreach”通过所有键:

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

以下是来自以下方面的实现:


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

这里是一个很好的
数组\u键示例,来自:

这同样适用于
数组_值
():

使用:

基本上:

array=(function(e){a=[];for (var i in e) a.push(e[i]); return a;})(HASHHERE)
第二个答案(在撰写本文时)给出:

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

var values = $.map(myHash, function(v) { return v; });
因为jQuery负责跨浏览器的兼容性。加上它比较短:)

无论如何,我总是尽可能地发挥作用。一行程序比循环更好。

请查看或中的u.keys()和.values()函数:


+1,但是,
循环的
内部应该包含一个检查,以确保当前键实际上是相关对象自己的属性(与继承属性相反)。否则,在IE中,您可能会得到一些意外的键:
if(Object.prototype.hasOwnProperty.call(a,key)){array_-keys.push(key);array_-values.push(a[key])}
@JAAulde:我不知道有任何这样的IE问题。枚举对象时。你能进一步描述一下这个问题吗?会找到什么钥匙?@amnotiam Crockford在他的LINT说明中推荐了这一点,并引用了他在@JAAulde上写的一篇关于这一问题的文章,
对象中的成员。原型应标记为不可枚举,并由“foreach”跳过,但是的,我相信旧IE实际上可能对此有问题。泰克斯。@JAAulde:老实说,我真的不在乎Crockford的建议。我不知道有什么IE问题。唯一的问题是将可枚举属性添加到
对象.prototype
,这很容易解决/可逆。和的可能重复。@greg0ire:受支持的浏览器通常是任何现代浏览器。一般来说,大多数使用的Chrome和Safari浏览器、Firefox 4+、Opera 10+(可能更早?)和IE9。您可以轻松地为这两种方法添加垫片以支持传统浏览器。@greg0ire:我添加了指向MDN提供的垫片的链接。这是一个很好的解决方案,但如果可能,代码应与IE7-8兼容。@greg0ire:包括链接的垫片将使其兼容,但如果您不需要,则IE7/8将无法工作。
var values=Object.values(myHash);
per您显示的函数似乎返回哈希而不是数组,或者{0:“test”}是[“test”]的同义词吗?您显示的函数似乎返回哈希而不是数组,或者{0:“test”}是[“test”]的同义词吗?@greg0ire它们不是同义词。
{0:“test”}
对象的一个实例
,而
[“test”]
数组
的一个实例。但是它们都有值
的成员
0
“test”
。JavaScript中有对象和数组。您正在谈论的哈希是一个对象。如果您查看
var tmp\u arr=[]
,它表明
tmp\u arr
变量是一个数组(
[]
),而不是一个对象(
{}
)。所以这两种方法都返回数组。我是说,因为您的函数似乎与“超现实梦想”提出的函数相同,并且他给出的链接表明这两个函数都应该返回哈希值。这是因为PHP.js提供的函数使用内部方法
keys()
values()
可能返回对象,因为对于JavaScript迭代
{0:'a',1:'b'}
['a','b']
是相同的。我已经更新了上面的函数,以便它们只返回数组。请注意“jquery/prototype”-样式对象:这些库向正在迭代的所有对象添加不同的函数,就像它们也是键一样…在本例中,您希望使用该对象。给定库提供的每个()函数:有点离题,但有点重要。。。
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;
}
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;
}
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)
var values = keys.map(function(v) { return myHash[v]; });
var values = $.map(myHash, function(v) { return v; });