Minulla on kaksi JavaScript-joukkoa:
var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
Haluan, että tuloste on:
var array3 = ["Vijendra","Singh","Shakya"];
Tulosjoukosta pitäisi poistaa toistuvat sanat.
Miten yhdistän kaksi matriisia JavaScriptissä niin, että saan kummastakin matriisista vain yksilölliset kohteet samassa järjestyksessä, jossa ne lisättiin alkuperäisiin matriiseihin?
Yhdistääksesi matriisit (poistamatta kaksoiskappaleita).
Array.concat
:var array1 = ["Vijendra", "Singh"];
var array2 = ["Singh", "Shakya"];
console.log(array1.concat(array2));
const array1 = ["Vijendra","Singh"];
const array2 = ["Singh", "Shakya"];
const array3 = [...array1, ...array2];
Koska ei ole olemassa 'sisäänrakennettua' tapaa poistaa kaksoiskappaleet (ECMA-262:ssa on itse asiassa Array.forEach
, joka olisi loistava tähän tarkoitukseen), meidän on tehtävä se manuaalisesti:
Array.prototype.unique = function() {
var a = this.concat();
for(var i=0; i<a.length; ++i) {
for(var j=i+1; j<a.length; ++j) {
if(a[i] === a[j])
a.splice(j--, 1);
}
}
return a;
};
Sitten käyttää sitä:
var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
// Merges both arrays and gets unique items
var array3 = array1.concat(array2).unique();
Tämä säilyttää myös matriisien järjestyksen (eli lajittelua ei tarvita).
Koska monet ihmiset ovat ärsyyntyneet Array.prototype
:n ja for in
-silmukoiden prototyyppien lisäyksestä, tässä on vähemmän invasiivinen tapa käyttää sitä:
function arrayUnique(array) {
var a = array.concat();
for(var i=0; i<a.length; ++i) {
for(var j=i+1; j<a.length; ++j) {
if(a[i] === a[j])
a.splice(j--, 1);
}
}
return a;
}
var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
// Merges both arrays and gets unique items
var array3 = arrayUnique(array1.concat(array2));
Niille, joilla on onni työskennellä selaimissa, joissa ES5 on käytettävissä, voit käyttää Object.defineProperty
:tä näin:
Object.defineProperty(Array.prototype, 'unique', {
enumerable: false,
configurable: false,
writable: false,
value: function() {
var a = this.concat();
for(var i=0; i<a.length; ++i) {
for(var j=i+1; j<a.length; ++j) {
if(a[i] === a[j])
a.splice(j--, 1);
}
}
return a;
}
});
Uusi ratkaisu ( joka käyttää Array.prototype.indexOf
ja Array.prototype.concat
):
Array.prototype.uniqueMerge = function( a ) {
for ( var nonDuplicates = [], i = 0, l = a.length; i<l; ++i ) {
if ( this.indexOf( a[i] ) === -1 ) {
nonDuplicates.push( a[i] );
}
}
return this.concat( nonDuplicates )
};
Käyttö:
>>> ['Vijendra', 'Singh'].uniqueMerge(['Singh', 'Shakya'])
["Vijendra", "Singh", "Shakya"]
Array.prototype.indexOf ( internet explorerissa ):
Array.prototype.indexOf = Array.prototype.indexOf || function(elt)
{
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0) ? Math.ceil(from): Math.floor(from);
if (from < 0)from += len;
for (; from < len; from++)
{
if (from in this && this[from] === elt)return from;
}
return -1;
};
//Array.indexOf was introduced in javascript 1.6 (ECMA-262)
//We need to implement it explicitly for other browsers,
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt, from)
{
var len = this.length >>> 0;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
//now, on to the problem
var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
var merged = array1.concat(array2);
var t;
for(i = 0; i < merged.length; i++)
if((t = merged.indexOf(i + 1, merged[i])) != -1)
{
merged.splice(t, 1);
i--;//in case of multiple occurrences
}
indexOf
-menetelmän toteutus muille selaimille on otettu MDC:stä