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)