Ответ 1
var array3 = array1.filter(function(obj) { return array2.indexOf(obj) == -1; });
MDN в массиве # filter: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter
Включает polyfill для старых браузеров.
У меня есть два массива в JavaScript:
var array1 = ['12','1','10','19','100'];
var array2 = ['12','10','19'];
Мне нужен метод, чтобы получить уникальные из двух массивов и поместить их в array3 Array3
должен быть -:
var array3 = ['1','100'];
Спасибо за помощь.
var array3 = array1.filter(function(obj) { return array2.indexOf(obj) == -1; });
MDN в массиве # filter: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter
Включает polyfill для старых браузеров.
С немного магией ES6 это может быть довольно кратким. Обратите внимание, что нам нужно проверить оба способа round incase, что в любом массиве есть уникальные элементы.
const arr1 = [1,2,3,4,5];
const arr2 = [1,3,8];
let unique1 = arr1.filter((o) => arr2.indexOf(o) === -1);
let unique2 = arr2.filter((o) => arr1.indexOf(o) === -1);
const unique = unique1.concat(unique2);
console.log(unique);
// >> [ 2, 4, 5, 8]
var unique = [];
for(var i = 0; i < array1.length; i++){
var found = false;
for(var j = 0; j < array2.length; j++){ // j < is missed;
if(array1[i] == array2[j]){
found = true;
break;
}
}
if(found == false){
unique.push(array1[i]);
}
}
ОБНОВЛЕНИЕ Исходная запись работает, но не очень быстро, эта реализация намного быстрее, в этом примере используется только один массив, но в функции вы можете легко передать любые дополнительные массивы для объединения.
выполняется только простая проверка на наличие ошибок, и больше должно быть на месте, используйте по своему усмотрению, только в качестве рабочего примера.
function Unique(array) {
var tmp = [];
var result = [];
if (array !== undefined /* any additional error checking */ ) {
for (var i = 0; i < array.length; i++) {
var val = array[i];
if (tmp[val] === undefined) {
tmp[val] = true;
result.push(val);
}
}
}
return result;
}
var unique = Unique([1, 2, 2, 6, 8, 5, 6, 8]);
Кроме того, это может быть реализовано как прототип объекта Array, изменяя подпись на
Array.prototype.Unique = function() {
var array = this;
...
}
и можно назвать так:
var unique = [1, 2, 2, 6, 8, 5, 6, 8].Unique();
Что-то вроде этого
var array1 = ['12','1','10','19','100'];
var array2 = ['12','10','19'];
var o = {};
for(var i in array1) {
o[i] = 1;
}
for(var i in array2) {
o[i] = 0;
}
var array3 = [];
for(var i in o) {
if(o[i] == 1) {
array3.push(i);
}
}
var array1 = ['12','1','10','19','100'];
var array2 = ['12','10','19'];
var newArr,temp,temp1;
temp=array1.filter(function(el)
{
return arr2.indexOf(el) == -1;
});
temp1=array2.filter(function(el)
{
return arr1.indexOf(el) == -1;
});
newArr=temp.concat(temp1);
return newArr;
}
Как и выше, но будет работать с более чем двумя массивами
var array1 = ['12','1','10','19','100'];
var array2 = ['12','10','19'];
var i = 0;
var hist = {};
var array3 = [];
buildhist(array1);
buildhist(array2);
for (i in hist) {
if (hist[i] === 1) {
array3.push(i);
}
}
console.log(array3);
function buildhist(arr) {
var i;
for (i = arr.length - 1; i >= 0; i--) {
if (hist[arr[i]] === undefined) {
hist[arr[i]] = 0;
}
hist[arr[i]]++;
}
}
var array3 = array1.concat(array2);
array3 = array3.sort(function(a, b) { return a > b; });
array3 = array3.filter(function(num, index) { return num !== array3[index + 1]; });
array3
будет иметь только уникальные значения
это также делает работу в двух циклах, которые довольно недороги, следует отметить, что sort() и filter() являются функциями ECMA5 и не поддерживаются в старых браузерах, также я обычно использую библиотеку, такую как подчеркивание, поэтому я не знаю, t переписать эти функции для каждого проекта, над которым я работаю, подчеркивание имеет метод .unique(), который, очевидно, меньше кода и более четко указывает намерение операции