gpt4 book ai didi

javascript - 用于根据先前值过滤序列的惯用 clojure 和 Javascript 表达式

转载 作者:行者123 更新时间:2023-12-04 01:55:42 26 4
gpt4 key购买 nike

所以我有一个整数序列。我想选择所有其他元素,但前提是它前面的元素是正数。例如,给定此输入:

4, 9, -1, 8, 3, 20, -1, 7

我想得到这个输出:

9, 20

(上下文:这些值表示已应用特定样式的文本段。4、9 对表示用户选择字符 4、9(不包括)并单击“粗体”。当用户“Unblods”时每对中的第一个成员变为 -1。因此为了找到所有“事件”样式,我需要过滤掉带有 -1 的样式)

我正在寻找 Javascript 和 Clojure 解决方案(因为此代码需要同时在浏览器端和服务器端运行)。

这是一个可能的 JS 实现:

styleList.map(function(curr, i) {
if (i % 2 == 1)
return (styleList[i - 1] >= 0) ? curr : -1;
else
return -1;
}).filter(function(curr) { return curr >= 0 })

我不喜欢这个解决方案:我传递给 .map() 的函数使用索引 i 来检查之前的值。这感觉很尴尬。我正在寻找功能更强大的解决方案。

编辑

这是另一个我不喜欢的解决方案(同样:由于 arr 对象的突变,功能不是很好):

var arr = [];
styleList.reduce(function(prev, curr) {
arr.push(prev == -1 ? -1 : curr);
return curr;
});
arr.filter(function(curr, i) {
return i % 2 == 1 && curr >= 0;
});

编辑2

这是@CandiedOrange 的建议(JS 实现使用 underscore 库):

_.zip(styleList, styleList.slice(1)).
slice(0, -1).
filter(function(pair, i) { return i % 2 == 0 }).
filter(function(pair) { return pair[0] >= 0 }).
map(function(pair) { return pair[1] })

评论:

  • 这可以通过组合两个 .filter 调用来缩短一点。不过,我认为最好将它们分开,因为 i % 2 == 0 是 impl 的产物。而 pair[0] >= 0 是这里需要的“真正的业务逻辑”。
  • 这看起来有点冗长。我希望函数式编程能够更好地处理这样的任务。在 Clojure 领域有没有更好的解决方案?

编辑3

这里困扰我的是,非功能性(命令式)解决方案非常微不足道:

var result = [];
styleList.forEach(function(curr, i) {
if (i % 2 == 1 && styleList[i - 1] >= 0)
result.push(curr);
});

当然,它不像 Clojure 解决方案那样简洁,但依赖的结构更少,因此 JS 开发人员比 Clojure 开发人员更可能实现 Clojure 解决方案(这需要熟悉 ->> partition first second map and filter)

最佳答案

在 Clojure 中:

(->> your-list 
(partition 2)
(filter #(pos? (first %)))
(map second))

编辑:根据@CandiedOrange 的要求进行解释:

  • 将你的列表分成两对
  • 过滤对,只保留第一个元素为正的对
  • 将每一对转换为单个项目(第二个)

关于javascript - 用于根据先前值过滤序列的惯用 clojure 和 Javascript 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28379196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com