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,我会相应地更新它。如果当前数组有多个元素,它会首先移动,最后一个或所有元素添加到队列中,它是否将它们添加到队列的开头或结尾?也许可以更新示例以演示这些场景。