Javascript 哈希键/值作为数组
我找不到PHP的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"] 与值相同的
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的垫片
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; });