2015-11-04 2 views
0

Am, имеющий 2 массив один с ниже форматеФильтр объекта массива путем сравнения с другим объектом массива

var obj1 = [{ 
    "Name": "Test1", 
    "id": 3 
}, { 
    "Name": "Test2", 
    "id": 4 
}]; 

, а другой

var obj2 = [{ 
    "visible": "true", 
    "id": 1 
}, { 
    "visible": "true", 
    "id": 2 
}, { 
    "visible": "true", 
    "id": 3 
}, { 
    "Name": "Test3", 
    "id": 4 
}, { 
    "visible": "true", 
    "id": 5 
}, { 
    "visible": "true", 
    "id": 6 
}]; 

мне нужно сравнить obj1 и obj2 и удалить элементы из obj2, которые не находятся в obj1 на основе Id. И всегда в obj2 мои id 1 и 2 не должны удаляться.

Мой окончательный о/р должно быть

var output = [{ 
    "visible": "true", 
    "id": 1 
}, { 
    "visible": "true", 
    "id": 2 
}, { 
    "visible": "true", 
    "id": 5 
}, { 
    "visible": "true", 
    "id": 6 
}] 

Так я сохранил 1 & 2 из 2 OBJ и удален пункт 5 & 6, не перечисленное obj1 в том же порядке.

Я пробовал использовать для зацикливания и использования среза и в конечном итоге не был там. какая-то помощь будет здорово

Благодаря

+0

@Tushar Я обновлю вопрос, который я пробовал с помощью цикла для сравнения и сравнения. но думал, что существует какой-то другой простой способ. – Peru

ответ

0

Вы можете использовать .filter() функцию JQuery в и встроенные функции Javascript .some() для этого:

var output = obj2.filter(function (elem) { 
    return !obj1.some(function (obj) { 
     return obj.id === elem.id; 
    }); 
}); 

output будет содержать отфильтрованный массив.

+0

'filter' и' some' не являются функциями jquery. Также это решение не исключает идентификаторы 1 и 2 –

+0

@CharlieH Как я уже сказал в своем ответе - есть функция .filter() 'JQuery, но' .some() 'является Javascript (вы можете даже см. мои ссылки). Я также исправил свой ответ, потому что мой код выводил только те элементы, которые содержатся в обоих массивах, а не исключая их. – spongeworthy

0

Использование метода Array.prototype.some по методу Array.prototype.filter для сравнения и настройки массивов.

Вот функция:

function compareArrays() { 

     //use filter method to create a new array after iteration of obj2 
     return obj2.filter(function (obj2Item) { 

      //Use some method to iterate obj1 
      return obj1.some(function (obj1Item) { 

       //Exclude desired items here 
       return (obj1Item.id === obj2Item.id) || (obj2Item.id === 1) || (obj2Item.id === 2); 
      }); 

     }); 

    }; 

Посмотрите, как работают эти методы.

Array.prototype.filter

Array.prototype.some

0

Вы можете использовать функцию карты для фильтрации элементов на основе состояния и IndexOf проверить элемент существует состояние.

var obj1 = [{ 
    "Name": "Test1", 
    "id": 3 
}, { 
    "Name": "Test2", 
    "id": 4 
}]; 

var obj2 = [{ 
    "visible": "true", 
    "id": 1 
}, { 
    "visible": "true", 
    "id": 2 
}, { 
    "visible": "true", 
    "id": 3 
}, { 
    "Name": "Test3", 
    "id": 4 
}, { 
    "visible": "true", 
    "id": 5 
}, { 
    "visible": "true", 
    "id": 6 
}]; 

var filterObject = $.map(obj2, function (v){ 
    if (v.id == 1 || v.id == 2) { 
     return v; 
    } 
    else { 
     var ids2 = $.map(obj1, function (vId){ 
      return vId.id; 
     }); 

     if (ids2.indexOf(v.id) != -1) { 
      return v; 
     } 
    } 
}); 
Смежные вопросы