среда, 8 февраля 2012 г.

JavaScript. Проверить является или нет один хеш подмножеством другого

Задача: Проверить два хеша на предмет того, является или нет, один из них подмножеством другого. Мы проверяем полное соответствие как ключей, так и значений. Порядок параметров значения иметь не должен.

Решение:
var isHashSubset = function(a, b){
  var f = true;
  for(var id in b){
    if(b.hasOwnProperty(id)){
      if(!((undefined!=a[id])&&(undefined!=b[id])&&(b[id]==a[id]))){
        f = false;
      }
    }
  }
  if(!f){
    f = true;   
    for(var id in a){
      if(a.hasOwnProperty(id)){
        if(!((undefined!=a[id])&&(undefined!=b[id])&&(b[id]==a[id]))){
          f = false;
        } 
      }    
    }
  }
  return f;
}

var x = {'key1':'val1','key2':'val2', 'key3':'val3'};
var y = {'key1':'val1','key2':'val2'};

console.log('Result:', isHashSubset(x,y) ); // TRUE
console.log('Result:', isHashSubset(y,x) ); // TRUE

var x = {'key1':'val1','key2':'val2', 'key3':'val3'};
var y = {'key1':'val1','key4':'val4'};

console.log('Result:', isHashSubset(x,y) ); // FALSE
console.log('Result:', isHashSubset(y,x) ); // FALSE


Значения null не будут учитываться, для того чтобы учитывать их также, нужно вместо условия (обоих условиях):
(!((undefined!=a[id])&&(undefined!=b[id])&&(b[id]==a[id])))

использовать:

(!((id in a)&&(id in b)&&(b[id]==a[id])))

Усовершенствованный вариант:

var isHashSubset = function(a, b, c){
  var f = true, 
      c = c || 0; // количество рекурсивных вызовов

  for(var id in b){
    if( b.hasOwnProperty(id) && !( undefined!=a[id] && undefined!=b[id] && b[id]==a[id] ) ){
      f = false;  
    }
  }
  return (!f && c == 0) ? isHashSubset(b, a, 1) : f;
}

Комментариев нет:

Отправить комментарий