JS проверяет взаимные элементы двух объектов

#javascript #object

#javascript #объект

Вопрос:

У меня есть 2 объекта JS:

Первый:

 One = {
   "Sunday": {
      1:false,
      2:false,
      3:true,
      4:false, .... until 24. Each item could be either true or false.
   },
   "Monday": {1:true, 2:false, ....},
   //And so on, 7 days of the week
}
  

Второй точно такой же, как первый, отличаются только его значения (true / false).

Я хочу запустить функцию, которая может сказать мне, мне все равно как, какие элементы есть true в обоих объектах. Например, если One.Sunday[2] = true и Two.Sunday[2] = true , я хочу это знать.

Я надеюсь, что я был достаточно ясен.

Если возможно, было бы неплохо, если бы эта же функция могла принимать также 3 или более объектов и возвращать взаимные элементы всех объектов.

Спасибо, Реувен

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

1. можете ли вы сказать мне, как должен выглядеть ваш результат?

2. Это не имеет значения. Может быть объектом с массивами взаимных связей — {"Sunday":[3, 4, 5, 9], "Monday:[1, 2, 7], and so on.} Но это не критично. Мне просто нужно, чтобы это было доступно для чтения с помощью JS

3. Это будет сложнее, чем вы, вероятно, думаете. Просто сравнить два объекта с известной структурой не так уж сложно, но когда у вас есть любое количество объектов, которое содержит objects, и вы собираетесь сравнить их все, вам нужна несколько сложная рекурсия и т.д.

Ответ №1:

 var sundayOne = {1:true,2:false,3:false,4:true}; 
var mondayOne = {1:true,2:true,3:false,4:false};
var tuesdayOne = {1:false,2:false,3:true,4:true};
var one = {"sunday":sundayOne,"monday":mondayOne,"tuesday":tuesdayOne}; // two objects having 


var sundayTwo = {1:true,2:true,3:true,4:true}; 
var mondayTwo = {1:false,2:false,3:false,4:false};
var tuesdayTwo = {1:true,2:true,3:true,4:true};
var two = {"sunday":sundayTwo,"monday":mondayTwo,"tuesday":tuesdayTwo};

var matchedArr = []
for(each in one) {
    var obj = {} //create new object
    obj[each] = {} //add new object to store matched each - Sunday, Monday
    for(subEach in one[each]) {
        //value is false so we have to check with undefined
        if(two[each][subEach] != undefined) {
            if(one[each][subEach] == two[each][subEach]) {
                console.log('Match found at ', each, subEach, one[each][subEach])
                obj[each][subEach] = one[each][subEach]
            }
        }
    }
    matchedArr.push(obj)
}
console.log(matchedArr)

//output
[Object, Object, Object]
0: Object
    sunday: Object
        1: true
        4: true
1: Object
    monday: Object
        3: false
        4: false
2: Object
    tuesday: Object
    3: true
        4: true
        length: 3
  

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

1. Выглядит великолепно. Прямо сейчас я адаптирую его к своему коду, но на данный момент он, кажется, работает идеально. 1 и V и a ОГРОМНОЕ спасибо 🙂

2. Спасибо за прекрасный ответ. Это более ценно, чем очки. 🙂

Ответ №2:

У меня здесь что-то работает для массива объектов, оно вернет массив mutual.

Два объекта

 var sunday = {1:true,2:false,3:false,4:true}; 
var monday = {1:true,2:true,3:false,4:false};
var tuesday = {1:false,2:false,3:true,4:true};
var one = {"sunday":sunday,"monday":monday,"tuesday":tuesday}; // two objects having 
var two = {"sunday":sunday,"monday":monday,"tuesday":tuesday};
  

Фильтрация взаимных :-

 function getMutuals (objects) { //get an array of objects
    var mutuals = [];
    objects.forEach(function(obj,index){ 
       mutuals[index] = {};        
       for(var key in obj){
           mutuals[index][key] = [];  //it will create key like sunday,monday in each obj
           var day = obj[key];  // get that key
           for(var i=1;i<25;i  ){  
               if(day[i])   //if day[i] is present
                   mutuals[index][key].push(i); //push that i into array of day
           }
       }
   });
   return mutuals;
}
  

вы можете вызвать эту функцию с множеством объектов, подобных следующим

 var mutuals = getMutuals([one,two]);
console.log(mutuals)
  

Ответ №3:

Попробуйте:

 function mutual(){
  var a = arguments, o = {};
  for(var i in a){
    var ai = a[i];
    out: for(var n in ai){
      o[n] = {}
      for(var q in ai[n]){
        if(!ai[n][q]){
          if(o[n][q]){
            delete o[n][q];
          }
          break out;
        }
        o[n][q] = true;
      }
    }
  }
  for(var i in o){
    var c = 0;
    for(var n in o[i]){
      c  ;  
    }
    if(c === 0){
      delete o[i];
    }
  }     
  return o;
}
// assumes One, Two, Three, Four, Five are Objects
// use firebug for this console.log() or create loops
console.log(mutual(One, Two, Three, Four, Five));