我有一堆数组,我想将它们联合起来,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" ]
关于javascript - 联合数组并保持顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31159040/