散列键/值作为数组[重复]
Posted
技术标签:
【中文标题】散列键/值作为数组[重复]【英文标题】: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。
【问题讨论】:
Get array of object's keys 和 How to get all properties values of a Javascript Object (without knowing the keys)? 的可能重复项。 【参考方案1】:在ES5 支持的(或垫片) 浏览器中...
var keys = Object.keys(myHash);
var values = keys.map(function(v) return myHash[v]; );
来自 MDN 的垫片...
Object.keys
Array.prototype.map
【讨论】:
@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】:查看Lodash 或Underscore.js 中的_.keys() 和_.values() 函数:
Underscore.js _.keys Underscore.js _.values Lodash _.keys Lodash _.values【讨论】:
【参考方案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的实现:
array_values array_keys这不是我的代码。我只是在为您指出一个有用的资源。
【讨论】:
您显示的函数似乎返回的是哈希值而不是数组,或者 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']
是相同的。我已经更新了上面的函数,以便它们只返回数组。以上是关于散列键/值作为数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章