#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.}
Но это не критично. Мне просто нужно, чтобы это было доступно для чтения с помощью JS3. Это будет сложнее, чем вы, вероятно, думаете. Просто сравнить два объекта с известной структурой не так уж сложно, но когда у вас есть любое количество объектов, которое содержит 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));