散列键/值作为数组[重复]

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'] 是相同的。我已经更新了上面的函数,以便它们只返回数组。

以上是关于散列键/值作为数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Redis数据操作之散列键 | Redis

Redis常用命令 字符串键散列键

将整个PHP数组散列成唯一值[重复]

Perl - 使用字符串代替散列键

根据散列键名批量删除redis散列值

接受整数散列键的整数散列函数是好的?