Каков наилучший способ перебора хэша в KRL? - PullRequest
4 голосов
/ 19 марта 2011

Допустим, у меня есть хэш, где я не знаю его содержимого (поэтому я не могу использовать для этого выбор).Вот пример хеша:

{ "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 голосов
/ 20 марта 2011

Майк, после удара я выделю время для построения оператора keys () для хэшей.

А пока что я обошел это, чтобы сохранить отдельный массив ключей.Таким образом, я могу использовать карту, фильтр и все операции над множествами для index , а затем использовать эти значения в качестве ключей для операций хеширования

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

Заметил, что я использовал оператор set 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 или фильтр операторов для передачи каждого значения индивидуально в функцию

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

c.filter(function(x){x<5})
2 голосов
/ 20 марта 2011

Полагаю, я понял это, но ответ немного хакерский.

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()
}

Эта рекурсивная функция выполняет итерацию по массиву имен, который содержит ключи в хэше, и удаляет ключ, который обрабатывается в каждой итерации.

Чтобы вызвать эту функцию, просто вызовите:

sorted_array = hash_to_sorted_array(params, names, []);

Для тех, кто не знаком с методами массива head () и tail (): head () дает вам первый элемент массива, а tail () - новый массив с первым элементом.удалено.

Мне не очень нравится это решение, потому что вы должны передать имена или ключи хеша в функцию в качестве одного из аргументов.На момент написания этой статьи я не знал ни одного способа извлечь только ключи из хеша, или я бы просто использовал это.

2 голосов
/ 19 марта 2011

Я предложу это:

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

См. http://docs.kynetx.com/docs/Select

...