Javascript 如果满足条件,洛达斯交换相邻项目

Javascript 如果满足条件,洛达斯交换相邻项目,javascript,functional-programming,lodash,Javascript,Functional Programming,Lodash,假设我有一个数组,[1,2,3,4,5,3,4,6,3,7,4]。我想交换3和4的值,如果它们是相邻的,顺序是[3,4](即[4,3]保持不变)。该示例的结果将是[1,2,4,3,5,4,3,6,3,7,4] 是否有一种优雅的方法可以在Lodash中执行此操作,而不使用for循环 编辑: 怎么样 _.sortBy(arr, function(value, index) { if (value === 3) { return index + 0.75; } els

假设我有一个数组,
[1,2,3,4,5,3,4,6,3,7,4]
。我想交换3和4的值,如果它们是相邻的,顺序是
[3,4]
(即
[4,3]
保持不变)。该示例的结果将是
[1,2,4,3,5,4,3,6,3,7,4]

是否有一种优雅的方法可以在Lodash中执行此操作,而不使用
for
循环

编辑: 怎么样

 _.sortBy(arr, function(value, index) {
    if (value === 3) {
        return index + 0.75;
    } else if (value === 4) {
        return index - 0.75;
    } else {
        return index
    }
});
编辑2: 按照以下步骤进行(实际上不是3和4)

是否有一种优雅的方法可以在Lodash中执行此操作,而不使用
for
循环

是的,您可以按如下方式使用
reduce

var数组=[1,2,3,4,5,3,4,6,3,7,4];
var结果=u0.reduce(数组,SwapadJacentinoder(3,4),[]);
警报(JSON.stringify(result));
函数swapAdjacentInOrder(a,b){
返回函数(结果、元素){
变量长度=result.length;
if(长度>0&&element==b){
var last=长度-1;
如果(结果[最后]==a){
结果[最后]=b;
元素=a;
}
}
结果[长度]=元素;
返回结果;
};
}

一种真正实用的方法是使用类似于
splitOn
的东西。但我们可以使用字符串(甚至不需要lodash)来实现这一点:


也许你想使用array.filter(lodash中的..filter),但我不清楚如何保存[4,3],我认为你应该,而不是在你的问题中,
[4,3,4,3]
会发生什么,如果它变成
[4,4,3,3]
?@Bergi更好的问题是
[3,4,4]
会发生什么?它应该变成
[4,4,4,3]
还是应该变成
[4,3,4,4]
?我猜是前者。其实这并不太重要!做了这样的事!你的效率要高很多,但我喜欢非常声明性。把我的解决方案放在上面。
return _.reduce(tags, function(out, tag) {
    var word = tag[0];

    if (out[0] && unitPowerSuffixes.hasOwnProperty(word)) {
        out.splice(-1, 0, {
            type: 'unit-power',
            value: unitPowerSuffixes[word]
        }); // Insert one from end
    } else {
        out.push(tag);
    }

    return out;
}, []);
arr.join().split("3,4").join("4,3").split(",").map(Number)