假设我有一个数组,[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]
。
在没有使用for
循环的情况下,是否有一种优雅方式在Lodash中执行此操作?
编辑: <怎么样
_.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)。
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;
}, []);
答案 0 :(得分:1)
在没有使用
for
循环的情况下,是否有一种优雅方式在Lodash中执行此操作?
是的,您可以按如下方式使用reduce
:
var array = [1, 2, 3, 4, 5, 3, 4, 6, 3, 7, 4];
var result = _.reduce(array, swapAdjacentInOrder(3, 4), []);
alert(JSON.stringify(result));
function swapAdjacentInOrder(a, b) {
return function (result, element) {
var length = result.length;
if (length > 0 && element === b) {
var last = length - 1;
if (result[last] === a) {
result[last] = b;
element = a;
}
}
result[length] = element;
return result;
};
}
&#13;
<script src="https://rawgit.com/lodash/lodash/master/lodash.min.js"></script>
&#13;
但是,swapAdjacentInOrder
函数还具有以下属性:
var array = [3, 4, 4, 4];
var result = _.reduce(array, swapAdjacentInOrder(3, 4), []);
alert(JSON.stringify(result)); // [4, 4, 4, 3]
function swapAdjacentInOrder(a, b) {
return function (result, element) {
var length = result.length;
if (length > 0 && element === b) {
var last = length - 1;
if (result[last] === a) {
result[last] = b;
element = a;
}
}
result[length] = element;
return result;
};
}
&#13;
<script src="https://rawgit.com/lodash/lodash/master/lodash.min.js"></script>
&#13;
如果您不想要,那么您可以执行以下更新的swapAdjacentInOrder
功能:
var array = [3, 4, 4, 4];
var result = _.reduce(array, swapAdjacentInOrder(3, 4), []);
alert(JSON.stringify(result)); // [4, 3, 4, 4]
function swapAdjacentInOrder(a, b) {
return function (result, element) {
var length = result.length;
if (length > 0 && element === b) {
var last = length - 1;
if (result[last] !== a || last > 0 && result[last - 1] === b);
else {
result[last] = b;
element = a;
}
}
result[length] = element;
return result;
};
}
&#13;
<script src="https://rawgit.com/lodash/lodash/master/lodash.min.js"></script>
&#13;
希望有所帮助。
答案 1 :(得分:1)
一种真正有效的方法是使用像splitOn
这样的东西。但我们可以使用字符串(甚至不需要lodash)来做到这一点:
arr.join().split("3,4").join("4,3").split(",").map(Number)