CFN*_*nja 62 javascript arrays
假设我有一个数组[34, 35, 45, 48, 49]和另一个数组[48, 55].我怎样才能得到一个结果数组[34, 35, 45, 48, 49, 55]?
Sal*_*ali 91
随着ES6与套装和splat操作员的到来(在仅在Firefox中工作时,检查兼容性表),您可以编写以下神秘的一个内衬:
var a = [34, 35, 45, 48, 49];
var b = [48, 55];
var union = [...new Set([...a, ...b])];
console.log(union);Run Code Online (Sandbox Code Playgroud)
关于这一行的一点解释:[...a, ...b]连接两个数组,你也可以使用a.concat(b).new Set()创建一个集合,从而创建你的联盟.最后一个[...x]将它转换回数组.
ken*_*ytm 44
如果您不需要保留订单,并考虑45并"45"保持相同:
function union_arrays (x, y) {
var obj = {};
for (var i = x.length-1; i >= 0; -- i)
obj[x[i]] = x[i];
for (var i = y.length-1; i >= 0; -- i)
obj[y[i]] = y[i];
var res = []
for (var k in obj) {
if (obj.hasOwnProperty(k)) // <-- optional
res.push(obj[k]);
}
return res;
}
console.log(union_arrays([34,35,45,48,49], [44,55]));Run Code Online (Sandbox Code Playgroud)
Cod*_*ler 43
如果您使用库下划线,您可以这样写
var unionArr = _.union([34,35,45,48,49], [48,55]);
console.log(unionArr);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>Run Code Online (Sandbox Code Playgroud)
参考:http://underscorejs.org/#union
Gar*_*ton 16
我可能在这里浪费时间在一个死线上.我只需要实现这一点,然后去看看我是否在浪费时间.
我真的很喜欢KennyTM的回答.这就是我如何解决这个问题.将密钥合并到散列中以自然地消除重复,然后提取密钥.如果你真的有jQuery,你可以利用它的好东西使这成为一个2行问题,然后将其转换为扩展.jQuery中的each()将负责不迭代hasOwnProperty()为false的项目.
jQuery.fn.extend({
union: function(array1, array2) {
var hash = {}, union = [];
$.each($.merge($.merge([], array1), array2), function (index, value) { hash[value] = value; });
$.each(hash, function (key, value) { union.push(key); } );
return union;
}
});
Run Code Online (Sandbox Code Playgroud)
请注意,两个原始数组都保持不变.然后你这样称呼它:
var union = $.union(array1, array2);
Run Code Online (Sandbox Code Playgroud)
function unique(arrayName)
{
var newArray=new Array();
label: for(var i=0; i<arrayName.length;i++ )
{
for(var j=0; j<newArray.length;j++ )
{
if(newArray[j]==arrayName[i])
continue label;
}
newArray[newArray.length] = arrayName[i];
}
return newArray;
}
var arr1 = new Array(0,2,4,4,4,4,4,5,5,6,6,6,7,7,8,9,5,1,2,3,0);
var arr2= new Array(3,5,8,1,2,32,1,2,1,2,4,7,8,9,1,2,1,2,3,4,5);
var union = unique(arr1.concat(arr2));
console.log(union);Run Code Online (Sandbox Code Playgroud)
改编自:https://stackoverflow.com/a/4026828/1830259
Array.prototype.union = function(a)
{
var r = this.slice(0);
a.forEach(function(i) { if (r.indexOf(i) < 0) r.push(i); });
return r;
};
Array.prototype.diff = function(a)
{
return this.filter(function(i) {return a.indexOf(i) < 0;});
};
var s1 = [1, 2, 3, 4];
var s2 = [3, 4, 5, 6];
console.log("s1: " + s1);
console.log("s2: " + s2);
console.log("s1.union(s2): " + s1.union(s2));
console.log("s2.union(s1): " + s2.union(s1));
console.log("s1.diff(s2): " + s1.diff(s2));
console.log("s2.diff(s1): " + s2.diff(s1));
// Output:
// s1: 1,2,3,4
// s2: 3,4,5,6
// s1.union(s2): 1,2,3,4,5,6
// s2.union(s1): 3,4,5,6,1,2
// s1.diff(s2): 1,2
// s2.diff(s1): 5,6
Run Code Online (Sandbox Code Playgroud)
小智 7
如果你想连接两个没有任何重复值的数组,试试这个
var a=[34, 35, 45, 48, 49];
var b=[48, 55];
var c=a.concat(b).sort();
var res=c.filter((value,pos) => {return c.indexOf(value) == pos;} );
Run Code Online (Sandbox Code Playgroud)
我喜欢Peter Ajtai的独特解决方案,但代码不是很清楚.这是一个更好的选择:
function unique(x) {
return x.filter(function(elem, index) { return x.indexOf(elem) === index; });
};
function union(x, y) {
return unique(x.concat(y));
};
Run Code Online (Sandbox Code Playgroud)
由于的indexOf返回的指数首次出现时,我们检查这对当前元素的索引(第二个参数过滤谓词).
| 归档时间: |
|
| 查看次数: |
102501 次 |
| 最近记录: |