联合数组并保持秩序

union arrays and keep order

本文关键字:数组      更新时间:2023-09-26

我有一堆数组,我想合并它们,lodash做到了:

_.union(['a', 'c'], ['a','b', 'c'], ['b', 'z'], ['y']) // ["a", "c", "b", "z", "y"]

我希望我的数组在需要时重新排列,即:

  • 首次出现['a', 'c']
  • 第二次出现时,我们在a之后有b,所以它应该返回['a', 'b', 'c']
  • 第三次出现时,我们在b之后有z,所以它应该返回['a', 'b', 'z', 'c']
  • 第四次出现时,我们只有y,所以它应该添加到数组['a', 'b', 'z', 'c', 'y']的末尾

我期望:

_.union(['a', 'c'], ['a','b', 'c'], ['b', 'z'], ['y']) // ['a', 'b', 'z', 'c', 'y']

我有

_.union(['a', 'c'], ['a','b', 'c'], ['b', 'z'], ['y']) // ["a", "c", "b", "z", "y"]

我怎样才能做到这一点?

编辑:调整了@Andy的小提琴,这是我的最终工作版本Demo

这里有一个冗长的非lodash版本:

function union() {
    var arrs = [].slice.call(arguments);
    var out = [];
    for (var i = 0, l = arrs.length; i < l; i++) {
        for (var j = 0, jl = arrs[i].length; j < jl; j++) {
            var currEl = arrs[i][j];
            if (out.indexOf(currEl) === -1) {
                if (j - 1 !== -1 && out.indexOf(arrs[i][j - 1]) > -1) {
                    out.splice(out.indexOf(arrs[i][j - 1]) + 1, 0, currEl);
                } else {
                    out.push(currEl);
                }
            }
        }
    }
    return out;
};
var result = union(['a', 'c'], ['a', 'b', 'c'], ['b', 'z'], ['y']);
console.log(result) // [ "a", "b", "z", "c", "y" ]

演示