在KRL中遍历哈希表的最佳方法是什么?

4

假设我有一个哈希表,但我不知道哈希表的内容(所以我不能使用pick方法)。以下是哈希表的示例:

{ "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个回答

3

迈克,在发生影响后,我会抽出时间为哈希表构建keys()运算符。

与此同时,为了解决这个问题,我已经保留了一个单独的键数组。这样,我可以在索引上使用map、filter和所有集合操作,然后使用这些值作为哈希操作的键。

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'};

现在,您可以使用mapfilter操作符将每个值单独传递给函数。

c.map(function(x){x+2})

c.filter(function(x){x<5})

不错!这正好符合我的想法。我忘记了 map 和 filter 运算符。我得把它们加进去。 - Mike Farmer

2

好的建议。问题是,我正在一个模块中使用它,我不认为我可以引发事件来启动foreach。我已经更新了问题以反映这一方面。 - Mike Farmer

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()返回一个新数组,其中已删除第一个元素。

我并不是很喜欢这个解决方案,因为你必须将哈希的名称或键作为参数之一传递到函数中。截至本文撰写时,我不知道有任何从哈希中提取仅键的方法,否则我会直接使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接