如果满足条件,Lodash交换相邻的项目

时间:2015-03-13 11:20:39

标签: 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]

在没有使用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;
}, []);

2 个答案:

答案 0 :(得分:1)

  

在没有使用for循环的情况下,是否有一种优雅方式在Lodash中执行此操作?

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

&#13;
&#13;
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;
&#13;
&#13;

但是,swapAdjacentInOrder函数还具有以下属性:

&#13;
&#13;
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;
&#13;
&#13;

如果您不想要,那么您可以执行以下更新的swapAdjacentInOrder功能:

&#13;
&#13;
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;
&#13;
&#13;

希望有所帮助。

答案 1 :(得分:1)

一种真正有效的方法是使用像splitOn这样的东西。但我们可以使用字符串(甚至不需要lodash)来做到这一点:

arr.join().split("3,4").join("4,3").split(",").map(Number)