Как искать объект JSON на основе идентификаторов, используя JQuery - PullRequest
0 голосов
/ 25 июня 2019

В моем веб-приложении, когда при начальной загрузке AJAX-вызов выдает следующую строку JSON.

[  
   {  
      "UserId":10259,
      "FullName":"jhno doil",
      "SupervisorId":"10165"
   },
   {  
      "UserId":10405,
      "FullName":"Adam mark",
      "SupervisorId":"10261"
   },
   {  
      "UserId":10400,
      "FullName":"belly barra",
      "SupervisorId":"10161"
   },
   {  
      "UserId":16224,
      "FullName":"silvester",
      "SupervisorId":""
   },
   {  
      "UserId":10416,
      "FullName":"Arnetta Chatcho",
      "SupervisorId":"10179"
   },
   {  
      "UserId":10244,
      "FullName":"Ashanti Bueti",
      "SupervisorId":"10165"
   }
]

Как написать функцию фильтра или запрос LINQ для выбора соответствующих записей на основе передачи строки SupervisorIds?Могу ли я написать LINQ с JQuery?эта функция должна принимать разделенную запятыми строку SupervisorIds и фильтровать соответствующий JSON на основе этого.

function usersBasedOnIDs(SupervisorIds){


}

Так я вызываю функцию,

usersBasedOnIDs("10165,10179,10161");
usersBasedOnIDs("10179,10161");
usersBasedOnIDs("10165");

И если я передаю пустую строку в функцию usersBasedOnIDs(""), весь объект JSON должен возвращаться без какой-либо фильтрации.

Как ясно например: 1 если я вызову fuction как usersBasedOnIDs("10165,10179,10161");

Этот JSON должен быть возвращен,

[  
   {  
      "UserId":10259,
      "FullName":"jhno doil",
      "SupervisorId":"10165"
   },
   {  
      "UserId":10400,
      "FullName":"belly barra",
      "SupervisorId":"10161"
   },
   {  
      "UserId":10416,
      "FullName":"Arnetta Chatcho",
      "SupervisorId":"10179"
   },
   {  
      "UserId":10244,
      "FullName":"Ashanti Bueti",
      "SupervisorId":"10165"
   }
]

например: 2 , если я называю fuction как usersBasedOnIDs("10165");

[  
   {  
      "UserId":10259,
      "FullName":"jhno doil",
      "SupervisorId":"10165"
   },
   {  
      "UserId":10244,
      "FullName":"Ashanti Bueti",
      "SupervisorId":"10165"
   }
]

Ответы [ 3 ]

3 голосов
/ 25 июня 2019

Вы можете использовать split для разделения строки, filter по SupervisorId и includes для проверки элемента в массиве.

Вам может потребоваться использовать JSON.Parse для преобразования строки в объект перед использованием.

Подробнее о функции на

Включает

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes Фильтр

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

function usersBasedOnIDs(SupervisorIds){
  let Supervisors = SupervisorIds.split(",");
  let result = data.filter(c=>SupervisorIds.includes(c.SupervisorId));
  console.log(result);
}

var data = [  
   {  
      "UserId":10259,
      "FullName":"jhno doil",
      "SupervisorId":"10165"
   },
   {  
      "UserId":10405,
      "FullName":"Adam mark",
      "SupervisorId":"10261"
   },
   {  
      "UserId":10400,
      "FullName":"belly barra",
      "SupervisorId":"10161"
   },
   {  
      "UserId":16224,
      "FullName":"silvester",
      "SupervisorId":""
   },
   {  
      "UserId":10416,
      "FullName":"Arnetta Chatcho",
      "SupervisorId":"10179"
   },
   {  
      "UserId":10244,
      "FullName":"Ashanti Bueti",
      "SupervisorId":"10165"
   }
];
//"10165,10179,10161"
function usersBasedOnIDs(SupervisorIds){
let result = [];
if(SupervisorIds == "") {
  result = data;
}else{
  let Supervisors = SupervisorIds.split(",");
  result = data.filter(c=> c.SupervisorId != "" && SupervisorIds.includes(c.SupervisorId));
}
console.log(result);
return result;
}

//usersBasedOnIDs("10165,10179,10161")
//console.log(usersBasedOnIDs("10165"))
usersBasedOnIDs("")
2 голосов
/ 25 июня 2019
const data = [
    {
        "UserId":10259,
        "FullName":"jhno doil",
        "SupervisorId":"10165"
    },
    {
        "UserId":10405,
        "FullName":"Adam mark",
        "SupervisorId":"10261"
    },
    {
        "UserId":10400,
        "FullName":"belly barra",
        "SupervisorId":"10161"
    },
    {
        "UserId":16224,
        "FullName":"silvester",
        "SupervisorId":""
    },
    {
        "UserId":10416,
        "FullName":"Arnetta Chatcho",
        "SupervisorId":"10179"
    },
    {
        "UserId":10244,
        "FullName":"Ashanti Bueti",
        "SupervisorId":"10165"
    }
];

function SearchById(id, field = "SupervisorId") {
    if (id === "") return data;
    return data.filter(value => {
        if(Array.isArray(id)) {
            return id.indexOf(value[field]) !== -1;
        }
        return value[field] === id;
    });
}

SearchById("10165");
SearchById(["10165", "10179"]);
// Search By Other Field
SearchById(10259, "UserId");

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

function SearchById(id, field = "SupervisorId") {
    if (id === "") return data;
    return data.filter(value => {
        if(id.split(',').length > 0) {
            const ids = id.split(',');
            return ids.indexOf(value[field]) !== -1;
        }
        return value[field] === id;
    });
}

Использование jQuery:

const data = [
    {
        "UserId":10259,
        "FullName":"jhno doil",
        "SupervisorId":"10165"
    },
    {
        "UserId":10405,
        "FullName":"Adam mark",
        "SupervisorId":"10261"
    },
    {
        "UserId":10400,
        "FullName":"belly barra",
        "SupervisorId":"10161"
    },
    {
        "UserId":16224,
        "FullName":"silvester",
        "SupervisorId":""
    },
    {
        "UserId":10416,
        "FullName":"Arnetta Chatcho",
        "SupervisorId":"10179"
    },
    {
        "UserId":10244,
        "FullName":"Ashanti Bueti",
        "SupervisorId":"10165"
    }
];
function SearchById(id, field = "SupervisorId") {
    return jQuery.grep(data, function(value) {
        if(id === "") return data;
        if(typeof(id) === "string" && id.split(',').length > 0) {
            const ids = id.split(',');
            return ids.indexOf(value[field]) !== -1;
        } else if(Array.isArray(id)) {
            return id.indexOf(value[field]) !== -1;
        }
        return value[field] === id;
    });
}

console.log("single", SearchById("10165"));
console.log("multiple array", SearchById(["10165", "10179"]));
console.log("multiple split", SearchById("10165,10179"));
console.log("empty", SearchById(""));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Подробнее о фильтр

2 голосов
/ 25 июня 2019

Вот ваша функция, использование массива лучше в следующих ситуациях:

function usersBasedOnIDs(SupervisorIds){

 //SupervisorIds is an Array !
 const data = YOUR DATA;
 var newData = [];
 if(SupervisorIds && SupervisorIds.length > 1){
   SupervisorIds.forEach(e => {
     if(SupervisorIds.includes(e.id))
      newData.push(e)
   });
   //if no match found, return an empty array
   return newData;
 }else{
   //No filter
   return data;
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...