2016-06-28 64 views
3

如果該值不存在,則需要將數組對象(arr1)的值推入另一個數組對象(arr2)。現有的值不會推入另一個數組中。如果值不存在,則將數組對象推入另一個數組對象

var arr1 = [{ 
    name: 'fred' 
}, { 
    name: 'bill' 
}, { 
    name: 'ted' 
}, { 
    name: 'james' 
}]; 

var arr2 = [{ 
    name: 'spil' 
}, { 
    name: 'fred' 
}, { 
    name: 'bill' 
},{ 
    name: 'paul' 
}, { 
    name: 'stone' 
}]; 

function add(name) { 
    var found = arr1.some(function (el) { 
     return el.name === name; 
    }); 
    if (!found) { 
     arr1.push(arr2); 
    } 
    return arr2; 
} 

Fiddle

+0

檢查[this。](http://stackoverflow.com/questions/1584370/how-to-merge-two-arrays-in-javascript-and-de-duplicate-items ?answertab =活動#tab-top)LiraNuna的答案會幫助你。 – zedz01

+0

你的函數'add'應該做什麼? –

+0

您正在討論將值推入'arr2',但是您的代碼做了相反的處理(或嘗試)。考慮到你的add()函數似乎需要一個字符串作爲輸入,會發生什麼(a)如果該值當前不在數組中? (b)如果它目前只有'arr1'? (c)如果它目前只有'arr2'? (d)如果它已經在兩個陣列中? – nnnnnn

回答

2

你可以使用查詢,如果name屬性已經在arr1哈希表。如果不是將實際項目推到arr1

var arr1 = [{ name: 'fred' }, { name: 'bill' }, { name: 'ted' }, { name: 'james' }], 
 
    arr2 = [{ name: 'toString' }, { name: 'spil' }, { name: 'fred' }, { name: 'bill' }, { name: 'paul' }, { name: 'stone' }], 
 
    hash = Object.create(null); 
 

 
arr1.forEach(function (a) { 
 
    hash[a.name] = true; 
 
}); 
 
arr2.forEach(function (a) { 
 
    hash[a.name] || arr1.push(a); 
 
}); 
 

 
console.log(arr1);

PS

只是爲了清楚,爲什麼Object.create(null),一個真正的空對象哈希,而不是{},一個空的對象。請注意項目{ name: 'toString' }。在第一部分,該項目被插入,第二個不是,因爲hash有一個名稱爲toString的屬性。

var arr1 = [{ name: 'fred' }, { name: 'bill' }, { name: 'ted' }, { name: 'james' }], 
 
    arr2 = [{ name: 'toString' }, { name: 'spil' }, { name: 'fred' }, { name: 'bill' }, { name: 'paul' }, { name: 'stone' }], 
 
    hash = {}; // now an object 
 

 
arr1.forEach(function (a) { 
 
    hash[a.name] = true; 
 
}); 
 
arr2.forEach(function (a) { 
 
    hash[a.name] || arr1.push(a); 
 
}); 
 

 
console.log(arr1);

1

如果你只追加一個變量,然後按()的作品就好了。如果您需要追加另一個數組,請使用concat(): var ar1 = [1,2,3]; var ar2 = [4,5,6];

var ar3 = ar1.concat(ar2); 

alert(ar1); 
alert(ar2); 
alert(ar3); 

會吐出:

"1,2,3" 
"4,5,6" 
"1,2,3,4,5,6" 

的CONCAT不影響AR1和AR2,除非重新分配,例如:

ar1 = ar1.concat(ar2); 
alert(ar1); 

顯示:

"1,2,3,4,5,6" 
0

喜檢查這個你可以推第一個數組其他陣列更高版本可以使用獨特的下劃線只返回唯一對象

var arr1 = [{ 
    name: 'fred' 
}, { 
    name: 'bill' 
}, { 
    name: 'ted' 
}, { 
    name: 'james' 
}]; 

var arr2 = [{ 
    name: 'spil' 
}, { 
    name: 'fred' 
}, { 
    name: 'bill' 
}, { 
    name: 'paul' 
}, { 
    name: 'stone' 
}]; 

arr1.push(arr2); 
arr1 = _.uniq(arr1, false, function(p) { 
    return p.name; 
}); 
+0

對於不知道Underscore是什麼的JS初學者? (另外,你將整個'arr2'數組作爲'arr1'的單個元素 - 我知道OP的代碼做到了這一點,但我不認爲這是他們想要的。) – nnnnnn

+0

ha再次啓動@nnnnnn –

1

使用indexOf爲獲得不存在name.Store首先你arr1名作爲數組!

var hasName = arr1.map(function(obj) { return obj.name; }); 
arr2.filter(function(v,i) { if(hasName.indexOf(v.name) == -1) arr1.push(v); });  
console.log(arr1); 
1

如果你有使用ECMAScript 6的奢侈品,那麼你可以創建這個可愛塊

var arr1 = [{ 
 
    name: 'fred' 
 
}, { 
 
    name: 'bill' 
 
}, { 
 
    name: 'ted' 
 
}, { 
 
    name: 'james' 
 
}]; 
 

 
var arr2 = [{ 
 
    name: 'spil' 
 
}, { 
 
    name: 'fred' 
 
}, { 
 
    name: 'bill' 
 
},{ 
 
    name: 'paul' 
 
}, { 
 
    name: 'stone' 
 
}]; 
 

 
arr2.forEach(arr2Item => arr1.find(({ name }) => name === arr2Item.name) || arr1.push(arr2Item)); 
 

 
console.log(arr1);

鑑於有大量遞歸的,你可能要存儲數據以不同的格式,所以你可以更容易地比較。你可以使用對象散列或ES6 Map讓你的生活更輕鬆。還要節省幾個週期

相關問題