2017-11-06 14 views
0

두 번째 객체 배열을 가지고 있는데, 첫 번째 배열 객체 속성과 두 번째 객체 배열에있는 값을 비교하고 싶습니다. (개체 수준에서).다른 객체의 다중 객체 값 검색 JavaScript

이때 어레이 (1)

[ 
    { 
    "id": "id1", 
    "name": "name1" 
    }, 
    { 
    "id": "id3", 
    "name": "name3" 
    } 
] 

어레이 (2)

[ 
    { 
    "id": "id1", 
    "name": "name1", 
    "other": "other" 
    }, 
    { 
    "id": "id2", 
    "name": "name2", 
    "other": "other" 
    }, 
    { 
    "id": "id3", 
    "name": "name3", 
    "other": "other" 
    } 
] 

는 어레이 (2)의 배열이 모두 1 개 값이 존재 진정한 때문에을 반환한다.

하지만 배열 2와 일치하지 않는 속성 값이 하나 있으면 false를 반환합니다.

[ 
    { 
    "id": "id1", 
    "name": "name1" 
    }, 
    { 
    "id": "id5", 
    "name": "name3" 
    } 
] 

{ "id": "id5", "name": "name3"}이 (가) array2에 없으므로 false를 반환합니다.

내가 루프에 대한 두 개의 비교하기 위해 노력하고있어하지만 난 두 루프의 모든 속성과 value.now을 비교 완료된 후 한 번만 false를 반환하고 싶어, 여기

내가 알고, 내가 노력하고있어 두 개의 루프입니다 이것은 잘못된 것입니다. 값을 찾지 못하면 거짓을 반환 할 것이고 이후 루프에 들어 가지 않기 때문입니다.

for (var i = 0, i < a.length; i++) { 
    for (var j = 0, j < b.length; j++) { 
    if (b[j].id === a[i].id && b[j].name === a[i].name) { 
     console.log('all values found'); 
     return true; 
    } 
    console.log('some values does not found'); 
    return false; 
    } 
} 

나는 또한 lodash를 사용하고 있습니다.

+0

안녕하세요, 혼란에 죄송합니다. 질문을 업데이트했습니다. – smvd08

+0

루프에서 돌아 가지 마십시오. 변수를 디폴트로 true로 설정하고 요소가 발견되지 않으면 false로 설정하십시오. 그런 다음 끝에 변수를 반환하십시오. – Taplar

+0

['Array.prototype.every()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every)는 여기에서 유용 할 것입니다. – mhodges

답변

1

사용 lodash의 _.intersectionBy(), 그리고 짧은 배열의 길이가 결과의 길이를 비교 :

var arr1 = [{"id":"id1","name":"name1","other":"other"},{"id":"id2","name":"name2","other":"other"},{"id":"id3","name":"name3","other":"other"}]; 
 
var arr2 = [{"id":"id1","name":"name1"},{"id":"id3","name":"name3"}]; 
 
var arr3 = [{"id":"id1","name":"name1"},{"id":"id5","name":"name3"}]; 
 

 
var result1_2 = _.intersectionBy(arr2, arr1, 'id').length === arr2.length; 
 

 
var result1_3 = _.intersectionBy(arr3, arr1, 'id').length === arr2.length; 
 

 
console.log(result1_2); 
 

 
console.log(result1_3);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

1

개체 속성이 같은 순서가있는 경우,이 문제를 해결할 수 :

const array1 = [ 
    { 
    "id": "id1", 
    "name": "name1" 
    }, 
    { 
    "id": "id2", 
    "name": "name2" 
    } 
], 
array2 = [ 
    { 
    "id": "id1", 
    "name": "name1", 
    "other": "other" 
    }, 
    { 
    "id": "id2", 
    "name": "name2", 
    "other": "other" 
    }, 
    { 
    "id": "id3", 
    "name": "name3", 
    "other": "other" 
    } 
]; 

let present = true, 
item, 
property, 
properties; 

for (let i = 0; i < array1.length && present; i++) { 
    item = array1[i]; 
    properties = Object.keys(item); 

    for (let j = 0; j < properties.length; j++) { 
    property = item[properties[j]]; 

    if (item.hasOwnProperty(properties[j])) { 
     if (property !== array2[i][Object.keys(array1[i])[j]]) { 
     present = false; 
     } 
    } 
    } 
} 
0

은 매우 간단 못생긴 방법은 t 문자열로 객체를 설정하고 비교하는 것입니다 단단히 묶으십시오 그러나 이것은 당신의 객체가 동일한 속성을 요구합니다

var a1 = [ 
    { 
    "id": "id1", 
    "name": "name1" 
    }, 
    { 
    "id": "id3", 
    "name": "name3" 
    } 
]; 

var a2 = [ 
    { 
    "id": "id1", 
    "name": "name1", 
    }, 
    { 
    "id": "id2", 
    "name": "name2", 
    }, 
    { 
    "id": "id3", 
    "name": "name3", 
    } 
]; 

var a3 = [ 
    { 
    "id": "id1", 
    "name": "name1" 
    }, 
    { 
    "id": "id5", 
    "name": "name3" 
    } 
]; 


var doesArrayBContainArrayA = function(a,b) 
{ 
    var u = []; 
    a.map(e => 
     { 
      var match = false; 
      b.forEach(function(bx){ 
      if(!match){ 
      match = JSON.stringify(bx) === JSON.stringify(e); 
      } 
      }); 
      if (!match){ 
       //console.log(JSON.stringify(bx)+'--'+JSON.stringify(e)); 
       u.push(e); //add non existing item to temp array 
      } 

    }); 
    return u.length === 0; 
} 
var result = doesArrayBContainArrayA(a3,a2); 
var result2 = doesArrayBContainArrayA(a1,a2); 
console.log(result); 
console.log(result2);