javascript - 联合数组并保持顺序

标签 javascript arrays

我有一堆数组,我想将它们联合起来,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的 fiddle ,这是我的最终工作版本 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" ]

DEMO

关于javascript - 联合数组并保持顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31159040/

相关文章:

javascript - 如何在键盘上按Enter键时调用JQUERY click()方法?

javascript - 如何从按钮加载另一个本地js

javascript - 带有 Flux 的嵌套循环 React 组件,更改父级或子级的监听器?

ruby-on-rails - 在 Ruby 中使用 max_by 查找哈希中最大数字的键

c++ - 在类成员函数中存储一个字符串数组并返回它

Java - 如何在属于对象数组的对象内查找变量的值?

python - 如何检索列表中具有特殊字符的特定字段

javascript - 单击 react 中的元素时如何更改存储在 LocalStorage 中的数据?

javascript - JS 无法从数组填充数组

javascript - 向除发件人以外的所有客户端发送响应