javascript - 使用 Ramda 减少 "position"属性

标签 javascript functional-programming ramda.js

对于这个对象:

const state = {
  a: {position: 1},
  b: {position: 2},
  c: {position: 3},
  d: {position: 4},
  e: {position: 5},
}

我想删除 b 对象,然后将具有更高位置的对象的 position 减 1(所以只是 cde)。结果状态应该是:

{
  a: {position: 1},
  c: {position: 2},
  d: {position: 3},
  e: {position: 4},
}

在玩了 Ramda 之后,我得到了这样的东西:

const removeElement = (state, elementId) => {
  const newState = dissoc('b', state)

  return pipe(
    filter((currentDoc) => currentDoc.position > state[elementId].position),
    clone,
    forEachObjIndexed((value, key) => (value.position-=1), __),
    merge(newState) 
  )(newState)
}

removeElement(state, 'b')

它有效,但我对它不是很满意,因为我觉得它有点冗长。你认为有更好的写法吗?

最佳答案

我可能会做这样的事情:

const {dissoc, map} = R

const reshape = (state, key, pos = state[key].position) => dissoc(key, map(
  ({position}) => position > pos ? {position: position - 1} : {position},
  state
))

const state = { a: { position: 1 }, b: { position: 2 }, c: { position: 3 }, d: { position: 4 }, e: { position: 5 }, };

console.log(reshape(state, 'b'))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

请注意,Nina 和 customcommander 之间关于remove 的讨论与此处相关。此版本不会更改您的原始版本。 Ramda 强调永远不要这样做。

如果您的状态值不仅仅是 {position: ?},那么这个版本应该可以解决问题:

const reshape = (state, key, pos = state[key].position) => dissoc(key, map(
  ({position, ...rest}) => position > pos 
    ? {position: position - 1, ...rest} 
    : {position, ...rest},
  state
))

或者,正如 Emi 指出的那样,这个版本的性能可能更高:

const reshape = (state, key, pos = state[key].position) => dissoc(key, map(
  (obj) => obj.position > pos ? {...obj, position: obj.position - 1} : obj,
  state
))

关于javascript - 使用 Ramda 减少 "position"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54306093/

相关文章:

function - 如何在 Rust 中实现多级柯里化(Currying)函数?

javascript - 使用 Ramda.js 基于数组过滤对象

javascript - 聚焦于元素,然后引发 keydown 或 keyup 空格事件

string - Elixir - 处理二进制文件、字符串和字符列表(项目 euler 8)

javascript - routeProvider 不重定向页面

java - Scala Option.orElse 等效于 Java Optional

javascript - 这个收敛和对的简写是什么?

javascript - 条件函数的无点样式

JavaScript 未在 jsfiddle.net 上运行

javascript - AJAX JQUERY 代码的哪一部分确定输出数据的占位符