Как отфильтровать JSON с помощью JavaScript - PullRequest
2 голосов
/ 28 июня 2019

Мне нужно отфильтровать огромный JSON-файл по его значению.

это мой JSON-код (это часть моего JSON-объекта, в реальном случае его более 1000).

var jsonObject = [  
   {  
      "UserId":10259,
      "FullName":"hello world",
      "CustomerId":"10165"
   },
   {  
      "UserId":10405,
      "FullName":"test value",
      "CustomerId":"10261"
   },
   {  
      "UserId":10400,
      "FullName":"mark ant",
      "CustomerId":"10161"
   },
   {  
      "UserId":16224,
      "FullName":"jhon cena",
      "CustomerId":""
   },
   {  
      "UserId":10416,
      "FullName":"shoze ahh",
      "CustomerId":"1"
   },
   {  
      "UserId":10244,
      "FullName":"kajal man",
      "CustomerId":"10"
   }
];

Чтобы отфильтровать вышеуказанный объект JSON, я использовал следующую функцию фильтра.

function usersBasedOnIDs(CustomerIds) {
    if (CustomerIds == "") {
        console.log(jsonObject);
    } else if (CustomerIds == "9999xx") {

        let result = jsonObject.filter(c => c.CustomerId == "");
        console.log(result);
    } else {
        let result = jsonObject.filter(c => c.CustomerId != "" && CustomerIds.includes(c.CustomerId));
        console.log(result);
    }   
}

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

usersBasedOnIDs("");
usersBasedOnIDs("10261,10165");
usersBasedOnIDs("9999xx"); 

Есть пара проблем с моим кодом,

  1. Эта функция не работает с IE 11 ранней версии

  2. И еще одна вещь, когда я вызываю функцию как usersBasedOnIDs("10261,10165"); или usersBasedOnIDs("10261");, она возвращает следующий вывод JSON

    {UserId: 10405, FullName: "test value", CustomerId: "10261"} {UserId: 10416, FullName: "shoze ahh", CustomerId: "1"} {UserId: 10244, FullName: "kajal man", CustomerId: "10"}

Но я ожидаю, только это

{UserId: 10405, FullName: "test value", CustomerId: "10261"}

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

Ответы [ 4 ]

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

Строка "10261,10165" включает 10261, а также строки 1 и 10.Вот почему вы также фильтруете эти идентификаторы.

Вместо этого вы можете split строку сначала в ,, чтобы получить массив идентификаторов клиентов, а затем использовать Array#includes

const array=[{"UserId":10259,"FullName":"hello world","CustomerId":"10165"},{"UserId":10405,"FullName":"test value","CustomerId":"10261"},{"UserId":10400,"FullName":"mark ant","CustomerId":"10161"},{"UserId":16224,"FullName":"jhon cena","CustomerId":""},{"UserId":10416,"FullName":"shoze ahh","CustomerId":"1"},{"UserId":10244,"FullName":"kajal man","CustomerId":"10"}]

function usersBasedOnIDs(CustomerIds) {
    if (CustomerIds === "")
        return array;
    
    if (CustomerIds == "9999xx")
      return array.filter(c => c.CustomerId == "")
    
   const ids =  CustomerIds.split(",");
   return array.filter(c => c.CustomerId !== "" && ids.includes(c.CustomerId));
}

console.log(usersBasedOnIDs("10261,10165"))
console.log(usersBasedOnIDs("10261"))

IE11 не поддерживает функции стрелок, String#includes и Array#includes.Вы можете изменить функцию стрелки на:

array.filter(function(c) {
  return c.CustomerId == ""
})

И

Использовать полифилл для Array#includes и String#includes

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

Итак, это полный ответ для IE 11, основанный на ответе @adiga.Измените функцию стрелки на нормальную функцию и используйте Array.indexOf вместо includes.

const array = [
  { UserId: 10259, FullName: "hello world", CustomerId: "10165" },
  { UserId: 10405, FullName: "test value", CustomerId: "10261" },
  { UserId: 10400, FullName: "mark ant", CustomerId: "10161" },
  { UserId: 16224, FullName: "jhon cena", CustomerId: "" },
  { UserId: 10416, FullName: "shoze ahh", CustomerId: "1" },
  { UserId: 10244, FullName: "kajal man", CustomerId: "10" }
];

function usersBasedOnIDs(CustomerIds) {
  if (CustomerIds === "") return array;

  if (CustomerIds == "9999xx") {
    return array.filter(function(c) {
      return c.CustomerId == "";
    });
  }

  const ids = CustomerIds.split(",");
  return array.filter(function(c) {
    return c.CustomerId !== "" && ids.indexOf(c.CustomerId) > -1;
  });
}

console.log(usersBasedOnIDs("10261,10165"))
1 голос
/ 28 июня 2019

Причина, по которой ваш код не работает в IE 11, заключается в том, что он использует функцию include для проверки, содержит ли массив значение. включает функцию , поддерживаемую в IE 14 и выше.Также функции стрелок не поддерживаются в IE 11 и более ранних версиях.

Ваш код не будет работать из-за пары ошибок.Во-первых, обратный вызов функции стрелки требует оператора возврата.Поэтому вместо:

c => c.CustomerId == ""

используйте:

c => return (c.CustomerId == "")

Также идентификаторы клиентов должны передаваться как массиввместо строки.Поэтому вместо использования:

usersBasedOnIDs("10261,10165");

Вам необходимо использовать:

usersBasedOnIDs([10261,10165]);
1 голос
/ 28 июня 2019

1) IE 11 не поддерживает функции стрелок

попробуйте изменить свою функцию на

var result = jsonObject.filter(function(c) { return c.CustomerId === ""; });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...