我有两个数组:
假如数组arr1中元素为1,2,3,4
数组arr2中元素为1,3,4
如何能通过JS把arr1和arr2中不同的元素2,给放到arr3这个数组里?有时候可能arr2中元素比arr1中元素多。
建hash,key为元素 value 为命中 初始为1
A所有元素放入hash 中并增加此key 命中*2
B所有元素放入hash 中并增加此key 命中*5
最后 如果尾数为0 则去掉.
[code="java"] function a (){
var arr1=[1,3,4];
var arr2=[1,2,4];
var arr3=[];
var hash3 = {} ;
for(var index in arr1){
var i = arr1[index];
var temp = hash3[""+i];
if(!temp){
hash3[""+i]=2;
}else{
hash3[""+i] = temp*2;
}
}
for(var index in arr2){
var i = arr2[index];
var temp = hash3[""+i];
if(!temp){
hash3[""+i]=5;
}else{
hash3[""+i] = temp*5;
}
}
for(var i in hash3 ){
var temp = hash3[""+i];
if(temp%10!=0){
arr3.push(i)
}
}
return arr3;
}
alert(a());[/code]
<script src="jquery-1.7.1.min.js"></script>
<script>
// arr1
var arr1 = [1,2,3,4,5,6];
// arr2
var arr2 = [3,4,5,6];
// 测试一
alert(getOnSameItem(arr1, arr2));
var arr3 = [1,2];
var arr4 = [1,3,4,5];
// 测试二
alert(getOnSameItem(arr3, arr4));
// 获取两个数据中不同的元素
function getOnSameItem(arr1, arr2){
var arr4 = new Array();
var sameArray = getSameItem(arr1, arr2);
// 删除数组一中相同的元素
for(var i=0;i<arr1.length;i++){
for(var j=0;j<sameArray.length;j++){
if(arr1[i]==sameArray[j]){
arr1.splice(i, 1);
}
}
}
// 删除数组二中相册的元素
for(var i=0;i<arr2.length;i++){
for(var j=0;j<sameArray.length;j++){
if(arr2[i]==sameArray[j]){
arr2.splice(i, 1);
}
}
}
arr4.push(arr1);
arr4.push(arr2);
return arr4;
}
// 获取两个数组中相同的元素
function getSameItem(arr1, arr2){
var arr3 = new Array();
// 遍历数组一与数组二添加数组一中的相同元素
for(var i=0;i<arr1.length;i++){
for(var j=0;j<arr2.length;j++){
if(arr1[i]==arr2[j]){
arr3.push(arr1[i]);
}
}
}
// 遍历数组二与数组一添加数组二中的相同元素
for(var i=0;i<arr2.length;i++){
for(var j=0;j<arr1.length;j++){
if(arr2[i]==arr1[j]){
arr3.push(arr2[i]);
}
}
}
return arr3;
}
</script>
:D 上面保存成html格式,再格式化下,贴上的代码格式没有了.不好意思. :D
对楼上的解答有几处不明白的地方:
1、getSameItem()方法里面,为什么有两个循环,找出相同的一个不够?
2、getOnSameItem()方法中,使用arr1.splice(i, 1); 不仅会影响到原来的数组arr1,而且效率很低。
因此我也给出一个解答:
var arr1 = [1,4,6];
var arr2 = [1,2,3];
var arrSame = getSameArr(arr1, arr2);
var arrAll = arr1.concat(arr2);
var arrDiff = getDiffArr(arrAll, arrSame);
alert(arrDiff);
function getSameArr(arr1, arr2) {
return getSameOrDiffArr(arr1, arr2, true);
}
function getDiffArr(arr1, arr2) {
return getSameOrDiffArr(arr1, arr2, false);
}
// 此处的getSameOrDiffArr整合了same和diff方法,所以看起来比较丑陋,你可以自己再分开
function getSameOrDiffArr(arr1, arr2, isGetSame) {
var arrRet = [];
for (var i = 0, len = arr1.length; i < len; i++) {
if (isGetSame && isExistArr(arr1[i], arr2)) {
arrRet.push(arr1[i]);
}
else if (!isGetSame && !isExistArr(arr1[i], arr2)) {
arrRet.push(arr1[i]);
}
}
return arrRet;
}
function isExistArr(strCmp, arrSrc) {
if (strCmp) {
for (var i = 0, len = arrSrc.length; i < len; i++) {
if (strCmp == arrSrc[i]) {
return true;
}
}
}
return false;
}
这里有个可优化之处,getSameArr的时候,实际上可以把其中一个的different找出来,这样能省去后来的部分循环。
不过这样做了,getSameArr就不好封装成方法,如下:
var arr1 = [1,4,6];
var arr2 = [1,2,3];
var arrSame = [];
var arrDiff = [];
for (var i = 0, len = arr1.length; i < len; i++) {
if (isExistArr(arr1[i], arr2)) {
arrSame.push(arr1[i]);
}
else {
arrDiff.push(arr1[i]);
}
}
for (var i = 0, len = arr2.length; i < len; i++) {
if (!isExistArr(arr2[i], arrSame)) {
arrDiff.push(arr2[i]);
}
}
alert(arrDiff);
function isExistArr(strCmp, arrSrc) {
if (strCmp) {
for (var i = 0, len = arrSrc.length; i < len; i++) {
if (strCmp == arrSrc[i]) {
return true;
}
}
}
return false;
}
希望能帮到lz :)
思路大致如下:
[code="js"]
var arr1 = [1,2,3,4],
arr2 = [1,3,4],
arr3 = [],
obj = {};
for(var i=0,len=arr1.length; i<len; i++){
obj[arr1[i]] = 1;
}
for(var j=0,jlen=arr2.length; j<jlen; j++){
if(obj[arr2[j]]){//存在则置为2
obj[arr2[j]] = 2;
}
}
for(var key in obj){
if(obj[key] == 1){
arr3.push(key);
}
}
alert(arr3.join(","));
[/code]
[code="jsp"]
function intersect(arr1,arr2){
var obj=new Object();
var arr3=new Array();
for (var i=0;i<arr1.length;i++){
eval("obj.pro"+arr1[i]+"='"+arr1[i]+"';");
}
for(var i=0;i<arr2[0].length;i++)
{
if(eval("typeof obj.pro"+arr2[i]+"!='undefined'")){
arr3.push(arr2[i]);
}
}
return arr3;
}
[/code]
大致是这样的,通过判断object是否已经被赋值来判断是否相同