2011-12-18 7 views
0

나는 자바 스크립트 문자열의 배열과 비교하고 새로운 배열에 일치하지 않는 값을 저장하는 기능을 원합니다. 현재 im은 중첩 된 jquery foreach를 사용합니다. 하지만 이보다 더 좋은 방법이 있다고 생각하니?자바 스크립트 배열을 비교

$.each(imagesInUploadsFolder, function(i, outervalue){ 
      $.each(imagesInDatabaseTable, function(i, innervalue){ 

       if(outervalue == innervalue){ 
        //match in both arrays... 
       } 

      }); 
     }); 
+0

분명히 비교를 위해'==='연산자를 사용하고 싶습니다 ... –

답변

1

$.inArray()이 잘 작동해야하지만 JSON 객체와 jQuery를 사용하는 방법은 다음과 같습니다.

var imagesInUploadsFolder = [ 
    '/path/to/img1.png', 
    '/path/to/img2.png', 
    '/path/to/img3.png' 
]; 
var imagesInDatabaseTable = [ 
    '/path/to/img1.jpg', 
    '/path/to/img2.png', 
    '/path/to/img4.png' 
]; 

var database_json = JSON.stringify(imagesInDatabaseTable); 

for (var i = 0; i < imagesInUploadsFolder.length; i++) { 
    console.log(imagesInUploadsFolder[i] + ' in ' + database_json); 
    if (database_json.indexOf(imagesInUploadsFolder[i]) > -1) { 
     console.log('In database: ' + imagesInUploadsFolder[i]); 
    } else { 
     console.log('Not in database: ' + imagesInUploadsFolder[i]); 
    } 
} 

http://jsfiddle.net/7nJPW/1/

EDIT 사실, JSON 방법이 필요하지 않습니다

(?) :

for (var i = 0; i < imagesInUploadsFolder.length; i++) { 
    console.log(imagesInUploadsFolder[i] + ' in ' + imagesInDatabaseTable); 
    if (imagesInDatabaseTable.indexOf(imagesInUploadsFolder[i]) > -1) { 
     console.log('In database: ' + imagesInUploadsFolder[i]); 
    } else { 
     console.log('Not in database: ' + imagesInUploadsFolder[i]); 
    } 
} 

http://jsfiddle.net/7nJPW/2/ 당신이 jQuery를 또는 for 루프를 사용하든

+0

고마워, 내가 missmatches을 찾고 있다고 언급 깜빡. 약간 수정 됨 :) http://jsfiddle.net/7nJPW/1/ – Johan

+0

@Johan - JSON 부분을 삭제할 수 있습니다. 불필요합니다. 내 편집을 참조하십시오. –

+0

@Johan - 그리고 이것은 더 좋을 것이다. ('c_uploads'를 보라) : http://jsfiddle.net/7nJPW/4/ –

1

그것은 내가 지금 생각할 수있는 가장 쉬운 방법 :

$.each(imagesInUploadsFolder, function(i, outervalue){ 
     if($.inArray(imagesInDatabaseTable,outervalue)>-1){ 
       //my operation 
     } 
    } 

참고입니다 : 사실 inArray은의 다른 innermatch -1 인덱스를 반환합니다. 네가 필요로 할 때마다.

+0

'.forEach()'와'.indexOf()'가 작업을 완료 할 때 왜 jQuery를 사용해야합니까? ' –

+0

그는 이미 jquery 스타일을 사용하고 있습니다. :) –

+0

더 나은 결과를 얻을 수 있습니다. –

1

왜 foreach를 pure javascript로 사용하지 않습니까?

for (var i = 0; i < innervalue.length; i++) { 
    for (var j = 0; j < outervalue.length; j++){ 
     if (innervalue[i] === outervalue[j]) 
      // match 
    } 
} 
2

이 방법에 대해 :

arr1.forEach(function (elem) { 
    if (arr2.indexOf(elem) > -1) { 
     // match... 
    } 
}); 
arr1arr2이 두 배열은

...

(, BTW 물론 IE8에 대한 ES5 심 ...)

+0

허. http://jsfiddle.net/7nJPW/3/ –

+0

@JaredFarrish 예? 이게 뭐야? –

+0

+1,하지만 당신은 각각 **와 ** indexOf 모두를 shim해야 할거야, 안 그래? –

0

, 스트레이트 아웃 비교는 O (n), 한 배열의 각 요소를 다른 배열의 모든 요소와 비교해야합니다.

개체가 비슷한 경우 적절한 비교 함수를 사용하여 항목을 정렬 한 다음 두 요소가 동시에 적게 있는지 확인하면서 두 배열을 동시에 반복 할 수 있습니다. 병합 정렬에 익숙하다면 병합 단계와 매우 유사합니다. 비교 함수가 O (1)이고 정렬이 O (n log (n))이고 합병 유사 비교 루프가 O (n)이고 총 시간 복잡도가 O (n log 여기서 "n"은 더 큰 배열의 길이입니다.

imagesInUploadsFolder.sort(imgCmp); 
    imagesInDatabaseTable.sort(imgCmp); 
    // diff will hold the difference of the arrays 
    var diff = []; 
    var i=0, j=0, cmp; 
    while (i < imagesInUploadsFolder.length && j < imagesInDatabaseTable.length) { 
     cmp = cmp(imagesInUploadsFolder[i], imagesInDatabaseTable[j]); 
     if (cmp < 0) { 
      // up[i] < db[j] 
      ++i; 
      diff.append(imagesInUploadsFolder[i]); 
     } else if (cmp > 0) { 
      // up[i] > db[j] 
      ++j; 
      diff.append(imagesInDatabaseTable[j]); 
     } else { 
      // up[i] == db[j] 
      ++i; ++j; 
     } 
    } 
    // one of the arrays may still have items; if so, loop over it and add the items 
    if (i < imagesInUploadsFolder.length) { 
     for (; i < imagesInUploadsFolder.length; ++i) { 
      diff.append(imagesInUploadsFolder[i]); 
     } 
    } else if (j < imagesInDatabaseTable.length)) { 
     for (; i < imagesInDatabaseTable.length; ++i) { 
      diff.append(imagesInDatabaseTable[i]); 
     } 
    } 
    // diff now holds items that are in only one of the two arrays. 

는 적합한 object ID function를 정의 할 경우, 요소들의 세트를 유지하는 보조 데이터 구조를 생성 할 수있다. 객체 속성에 접근하는 것이 O (f (n))이면 (해시 f = 1, 균형 잡힌 나무 f = log (n)),이 접근법은 O (n * f (n))이므로, 정렬 - 비교 접근법보다 더 복잡하지 않습니다. 테스트되지 않은 비효율적 구현 :

는 노동 조합과 배열의 차이를 모두 원하는 경우
function Set(from) { 
    this.elements = {}; 
    this.size = 0; 
    if (from) { 
     for (var i=0; i < from.length) { 
      this.add(from[i]); 
     } 
    } 
} 
Set.prototype.each = function(f) { 
    var eltId; 
    foreach (eltId in this.elements) { 
     f(this.elements[eltId], eltId); 
    } 
}; 
Set.prototype.clone = function() { 
    var clone = new Set(); 
    this.each(function(obj, id) { 
     clone.add(obj); 
    }); 
    return clone; 
}; 
Set.prototype.contains = function(obj) { 
    return obj.uniqueId() in this.elements; 
}; 
Set.prototype.add = function(obj) { 
    var objId = obj.uniqueId(); 
    if (! (objId in this.elements)) { 
     ++this.size; 
     this.elements[objId] = obj; 
    } 
    return this; 
}; 
Set.prototype.remove = function(obj) { 
    var objId = obj.uniqueId(); 
    if (objId in this.elements) { 
     --this.size; 
     delete this.elements[objId]; 
    } 
    return this; 
}; 
Set.prototype.union = function(other) { 
    other.each(function(elt, id) { this.add(elt); }); 
    return this; 
}; 
Set.prototype.sub = function(other) { 
    other.each(function (elt, id) { 
     this.remove(elt); 
    }); 
    return this; 
}; 
Set.prototype.diff = function(other) { 
    var mine = this.clone(); 
    mine.sub(other); 
    var others = other.clone(); 
    others.sub(this); 
    mine.union(others); 
    return mine; 
}; 
Set.prototype.toArray = function(obj) { 
    var arr = []; 
    this.each(function(elt, id) { 
     arr.append(elt); 
    }); 
    return arr; 
}; 

var uploadsSet = new Set(imagesInUploadsFolder), 
    dbSet = new Set(imagesInDatabaseTable), 
    imagesInJustOne = uploadsSet.diff(dbSet); 

, 당신은보다 효율적으로 대신 별도 Set.diffSet.union을 사용을 계산하는 Set에 적합한 방법을 정의 할 수 있습니다.

+0

Outis, 이것이 Rainman 순간 이었습니까? 그게 .. 대답이야. –

관련 문제