在KRL中迭代Hash的最佳方法是什么?

时间:2011-03-19 15:18:38

标签: hash krl

假设我有一个哈希,我不知道哈希的内容(所以我不能使用选择这个)。以下是哈希的示例:

{ "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...

}

3 个答案:

答案 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}");
}

请参阅http://docs.kynetx.com/docs/Select

答案 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()为你提供了一个删除了第一个元素的新数组。

我真的不喜欢这个解决方案,因为你必须将哈希的名称或密钥作为参数之一传递给函数。在撰写本文时,我不知道有任何方法可以从哈希中提取密钥,或者我只是使用它。