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

}
4

3 回答 3

3

Mike,在受到影响后,我将抽出时间为哈希构建一个 keys() 运算符。

与此同时,我为解决这个问题所做的就是保留一个单独的键数组。这样,我可以在索引上使用 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);
}

注意到我使用集合运算符联合来保持数组充满唯一值

生成的 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})
于 2011-03-19T23:11:01.890 回答
2

我会建议这个:

foreach my_hash setting(key, value)
pre {
  my_array.push("#{key}=#{value}");
}

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

于 2011-03-19T15:44:00.687 回答
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() 为您提供一个删除了第一个元素的新数组。

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

于 2011-03-19T22:15:51.113 回答