这个问题是关于函数式编程,而不是关于如何构建URL查询字符串。我正在使用的语言是Objective-C,但这也不是特别相关。
我有一个起始数据结构,它是一个字符串数组。每个奇数元素都是参数名称,每个偶数都是值,例如[firstname,bob,lastname,smith,gender,male]。
是否有一种惯用的FP方法将此列表转换为URL查询字符串(例如“firstname = bob& lastname = smith& gender = male”)?
我正在考虑使用“使用mod 2谓词进行分区”的行,分别给出2个键和值列表,然后使用url转义键和值的函数zip并使用'='连接它们。这将给我一个'a = b'字符串的列表。然后我应该可以做一个折叠左边插入'&'符号。
我想我可能刚刚回答了我自己的问题!甜!无论如何,如果有人更熟悉FP习语,想要发表评论。
谢谢!
答案 0 :(得分:1)
这或多或少都是在Haskell中使用标准前奏函数:
queryStr paramList = joinAmp $ map (uncurry joinEq) $ group2 paramList
where joinEq x y = x ++ "=" ++ y
joinAmp = foldr1 (\x y -> x ++ "&" ++ y)
group2 [] = []
group2 (x:y:xs) = (x, y) : group2 xs
qStr = queryStr ["firstname", "bob", "lastname", "smith", "gender", "male"]
检查您的环境是否具有字符串连接功能。例如,在Python中,您可以为上面的"&".join(lst)
函数执行joinAmp
。由于Haskell实现字符串连接的方式,我使用了右折叠。
答案 1 :(得分:1)
这里或多或少是将您的英语直接翻译成C#:
var list = new[]{"firstname", "bob", "lastname", "smith", "gender", "male"};
string.Join("&",
list.Where((k, i) => i % 2 == 0)
.Zip(list.Where((v, i) => i % 2 == 1),
(k, v) => k + "=" + v));
答案 2 :(得分:-1)
String o;
for (i=0; i< -1 + size(strings); i=i+2) {
if (i==0) {
o += "?";
} else {
o += "&";
};
o+= strings[i]+"="+ strings[i+1];
}
print o;