假设我有一个哈希,我不知道哈希的内容(所以我不能使用选择这个)。以下是哈希的示例:
{ "key1" : "value1", "key2" : "value2", "key3" : "value3" }
我想迭代这个哈希并创建以下数组:
["key1=value1", "key2=value2", "key3=value3"]
我的第一种方法是构建一个递归函数,迭代遍历哈希并填充数组,但我不确定是否可以完成。在数组中,我可以使用head()和tail()来帮助递归,但是这些运算符不能用于哈希(据我所知)。
我想在函数中启动它,因为我在模块中执行此操作。例如:
hash_to_array = function(h) {
// magic code here
}
manipulate_params = function(params) {
params_array = hash_to_array(params);
// more code here...
}
答案 0 :(得分:3)
迈克,在冲击之后,我将花时间为哈希构建一个key()运算符。
与此同时,我所做的就是保持一个单独的键阵列。这样,我可以在索引上使用map,filter和所有set操作,然后使用这些值作为哈希操作的键
key_array = ["key1","key2","key3"];
my_hash = { "key1" : "value1", "key2" : "value2", "key3" : "value3" };
这实际上只有在您控制散列中的值时才有效,但这里有一些示例代码:
global {
kvHash = { "key1" : "value1", "key2" : "value2", "key3" : "value3" };
kArray = ["key1","key2","key3"];
}
pre {
pickKey = kArray[1];
value = kvHash.pick("$.#{pickKey}");
// add a new value
newKey = "key4";
newVal = "value4";
newArray = kArray.union(newKey);
newHash = kvHash.put([newKey],newVal);
}
注意到我使用了集合运算符 union 来保持数组中的唯一值
生成的javascript显示了它的作用:
var pickKey = 'key2';
var value = 'value2';
var newKey = 'key4';
var newVal = 'value4';
var newArray = ['key1', 'key2', 'key3', 'key4'];
var newHash = {'key2' :'value2','key1' :'value1','key4' :'value4','key3' :'value3'};
现在,您可以使用 map 或 filter 运算符将每个值分别传递给函数
c.map(function(x){x+2})
c.filter(function(x){x<5})
答案 1 :(得分:2)
我会建议:
foreach my_hash setting(key, value)
pre {
my_array.push("#{key}=#{value}");
}
答案 2 :(得分:2)
我相信我已经想到了这一点,但答案有点像黑客。
hash_to_sorted_array = function(params, names, new_a) {
n = names.head();
val = params.pick("$.#{n}", true);
appended_array = new_a.append("#{n}=#{val.head()}");
finished_array = (names.length() == 0) => new_a |
hash_to_sorted_array(params, names.tail(), appended_array);
finished_array.sort()
}
这个递归函数遍历names数组,该数组包含哈希中的键,并删除它在每次迭代中处理的键。
要调用此函数,只需调用:
sorted_array = hash_to_sorted_array(params, names, []);
对于那些不熟悉数组的head()和tail()方法的人:head()为你提供数组中的第一个元素,而tail()为你提供了一个删除了第一个元素的新数组。
我真的不喜欢这个解决方案,因为你必须将哈希的名称或密钥作为参数之一传递给函数。在撰写本文时,我不知道有任何方法可以从哈希中提取密钥,或者我只是使用它。