Javascript 将嵌套对象推送到数组中的下一个对象[功能样式]

Javascript 将嵌套对象推送到数组中的下一个对象[功能样式],javascript,lodash,ramda.js,Javascript,Lodash,Ramda.js,我想从一个像这样的物体上得到 [{current: [1], queue: []}, {current: [2], queue: []}, {current: [3], queue: []}] 为此: [{current: [], queue: [3]}, {current: [], queue: [1]}, {current: [], queue: [2]}] 基本上,我想将当前项目推送到下一个项目的队列 我想使用lodash或ramda.js以功能性的方式来实现这一点。我对函数式编程非常

我想从一个像这样的物体上得到

[{current: [1], queue: []}, {current: [2], queue: []}, {current: [3], queue: []}]
为此:

[{current: [], queue: [3]}, {current: [], queue: [1]}, {current: [], queue: [2]}]
基本上,我想将当前项目推送到下一个项目的队列


我想使用lodash或ramda.js以功能性的方式来实现这一点。我对函数式编程非常陌生,在如何实现这一点上遇到了难题,尤其是在处理arr[2]->arr[0]案例时。我考虑过使用reduce,但我不确定这是否是解决问题的最佳方法。

一个简单的方法是制作一个深度拷贝,并将最后一项移动到该拷贝的第一个位置

然后迭代原始,将每个队列更新为重新排列副本中的匹配索引

变量数据=[{current:[1],队列:[]},{current:[2],队列:[]},{current:[3],队列:[]}, //复制数组 copy=JSON.parseJSON.stringifydata; //将副本中的最后一个移动到第一个 copy.unshiftcopy.pop; data.forEachel,i=>{ el.queue=copy[i]。当前; el.current.length=0; }; 您可以使用console.logdata来实现这一点

var result = array.map(function(value, index) {
  // get previous array value
  var prev = array[(index - 1 + array.length) % array.length];
  return Object.assign(
    {}, // Makes sure that we don't mutate the original array
    value, // retain properties that are not `current` and `queue`
    { current: prev.queue, queue: prev.current } // override
  );
});
变量数组=[{ 当前:[1], 队列:[] }, { 当前:[2], 队列:[] }, { 当前:[3], 队列:[] }]; var result=array.mapfunctionvalue,索引{ //获取上一个数组值 var prev=array[index-1+array.length%array.length]; 返回Object.assign {},//确保不改变原始数组 值,//保留不是“当前”和“队列”的属性` {current:prev.queue,queue:prev.current}//override ; }; console.logresult; .作为控制台包装{最小高度:100%;顶部:0;}一个有趣的ramda解决方案:

创建一个新数组,在最后一项之前添加前缀,例如:[1,2,3]到[3,1,2,3] 使用光圈创建对,例如:[[3,1],[1,2],[2,3]] 使用合并功能从一对中创建新项,例如:[4,3,5] mergePair和loop函数的编写方式可能不同。。。我在文档中找不到合适的候选人

const data = [{current: [1], queue: []}, {current: [2], queue: []}, {current: [3], queue: []}];

const mergePair = ([left, right]) => 
({ current: [], queue: concat(right.queue, left.current) })

const loop = arr => prepend(last(arr), arr);

const updateQueue = pipe(
  loop,
  aperture(2),
  map(mergePair)
)

updateQueue(data);

试试看

仍然需要迭代来更改属性值,这些解决方案中没有一个能够更改属性值。请注意,slice只会浅层复制新数组…但是元素对象引用仍然相同。如果您是对的,没有正确读取OP,我会相应地更新它。如果当前数组有多个元素,它会首先移动,最后一个或所有元素添加到队列中,它是否将它们添加到队列的开头或结尾?也许可以更新示例以演示这些场景。