联合数组并保持秩序

时间:2015-07-01 10:42:18

标签: javascript arrays

我有一堆数组,我想要将它们联合起来,lodash会这样做:

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

我期望我的阵列在需要时重新排列,即:

  • 首次出现['a', 'c']
  • 第二次出现后我们有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

1 个答案:

答案 0 :(得分:2)

这是一个冗长的非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" ]

DEMO