У меня есть массив объектов. Я хочу, чтобы отфильтровать массив на основе объекта имеет условие.

Мой массив выглядит следующим образом:

var data = [
{
  "name": "nitin",
  "r_id": "1",
  "t_id": "4"
},
{
 "name": "test",
  "r_id": "2",
  "t_id": "3"
},
{
  "name": "test1",
  "r_id": "2",
  "t_id": "4"
},
{
  "name": "test3",
  "r_id": "3",
  "t_id": "3"
},
{
  "name": "test2",
  "r_id": "1",
  "t_id": "1"
}]

И мой объект заключается в следующем:

var obj = {
role:['1','2'],
type:['1','3']
}

Где r_id - идентификатор роли, а t_id - идентификатор типа.

Поэтому я хочу результаты, чей идентификатор роли в 1 или 2 И тип идентификатора в 1 или 3.

Математически role_id && type_id ((1 || 2) && (1 || 3))

Мой вывод должен понравиться:

var result = [
{
  'name':'test',
  'r_id':2,
  't_id':3,
},
{
  'name':'test2',
  'r_id':1,
  't_id':1,
}];
0
Nitin 13 Янв 2017 в 16:15

4 ответа

Лучший ответ
var data = [
{
  "name": "nitin",
  "r_id": "1",
  "t_id": "4"
},
{
 "name": "test",
  "r_id": "2",
  "t_id": "3"
},
{
  "name": "test1",
  "r_id": "2",
  "t_id": "4"
},
{
  "name": "test3",
  "r_id": "3",
  "t_id": "3"
},
{
  "name": "test2",
  "r_id": "1",
  "t_id": "1"
}]

var obj = {
role:['1','2'],
type:['1','3']
}

let result = data.filter(item=>{
	return obj.role.indexOf(item.r_id) > -1 && obj.type.indexOf(item.t_id) > -1
})

console.log(result)
1
Mirko Vukušić 13 Янв 2017 в 13:21

Вам просто нужно повторить ваш data и посмотреть, присутствуют ли ключи (r_id и t_id) в obj (в соответствующих массивах). Для этого вы можете использовать Array.filter

var data = [{"name":"nitin","r_id":"1","t_id":"4"},{"name":"test","r_id":"2","t_id":"3"},{"name":"test1","r_id":"2","t_id":"4"},{"name":"test3","r_id":"3","t_id":"3"},{"name":"test2","r_id":"1","t_id":"1"}]

var obj = {
  role:['1','2'],
  type:['1','3']
}

var result = data.filter(function(element){
    return obj.role.indexOf(element.r_id) !== -1 && // element has valid role
           obj.type.indexOf(element.t_id) !== -1 // element has valid type
})

console.log(result)
0
taguenizy 13 Янв 2017 в 13:27
var data = [
{
  "name": "nitin",
  "r_id": "1",
  "t_id": "4"
},
{
 "name": "test",
  "r_id": "2",
  "t_id": "3"
},
{
  "name": "test1",
  "r_id": "2",
  "t_id": "4"
},
{
  "name": "test3",
  "r_id": "3",
  "t_id": "3"
},
{
  "name": "test2",
  "r_id": "1",
  "t_id": "1"
}]

var obj = {
role:['1','2'],
type:['1','3']
}

var filterItems = data.filter(function(o){ 
   return obj.role.indexOf(o.r_id) != -1  && obj.type.indexOf(o.t_id) != -1; });

console.log(filterItems);
0
Anil Talla 13 Янв 2017 в 13:23

Вы можете немного изменить obj для соответствующих им названий свойств в данных, а затем использовать Array#filter и проверьте с помощью Array#every для требуемого элемента.

var data = [{ name: "nitin", r_id: "1", t_id: "4" }, { name: "test", r_id: "2", t_id: "3" }, { name: "test1", r_id: "2", t_id: "4" }, { name: "test3", r_id: "3", t_id: "3" }, { name: "test2", r_id: "1", t_id: "1" }],
    obj = { r_id: ['1', '2'], t_id: ['1', '3'] },
    keys = Object.keys(obj),
    result = data.filter(function (o) {
        return keys.every(function (k) {
            return obj[k].indexOf(o[k]) !== -1;
        });
    });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0
Nina Scholz 13 Янв 2017 в 13:24