Как я могу проверить, содержит ли массив значение в Javascript для данных JSON?

#javascript #jquery #json

#javascript #jquery #json

Вопрос:

Прошу прощения, поскольку я новичок в сообществе и в настоящее время изучаю применение Javascript и JSON для приведенных ниже:

Я пытаюсь сопоставить «id»: 7, «name»: «UPS», «parent_id»: [3, 4], когда пользователь выбирает либо «id»: 3, либо «id»: 4

Могу ли я узнать, как мне следует реализовать .indexOf или .includes в моем коде ниже

index.html

 <script>
$(document).ready(function(){

 load_json_data('service');

 function load_json_data(id, parent_id)
 {
  var html_code = '';
  $.getJSON('data.json', function(data)
  {
   html_code  = '<option value="">Select ' id '</option>';
   $.each(data, function(key, value)
   {
    if(id == 'service')
    {
     if(value.parent_id == '0')
     {
      html_code  = '<option value="' value.id '">' value.name '</option>';
     }
    }
    else
    {
     if(value.parent_id == parent_id)
     {
      html_code  = '<option value="' value.id '">' value.name '</option>';
     }
    }
   });
   $('#' id).html(html_code);
  });

 }

 $(document).on('change', '#service', function(){
  var service_id = $(this).val();
  if(service_id != '')
  {
   load_json_data('item', service_id);
   $('#contact').html('<option value="">Select contact</option>');
  }
  else
  {
   $('#item').html('<option value="">Select item</option>');
   $('#contact').html('<option value="">Select contact</option>');
  }
 });
 $(document).on('change', '#item', function(){
  var item_id = $(this).val();
  if(item_id != '')
  {
   load_json_data('contact', item_id);
  }
  else
  {
   $('#contact').html('<option value="">Select contact</option>');
  }
 });
});
</script>
  

data.json

 [
 {
  "id": 1,
  "name": "Delivery",
  "parent_id": 0
 }, 
 {
  "id": 2,
  "name": "Repair",
  "parent_id": 0
 }, 
 {
  "id": 3,
  "name": "Quick Deliver",
  "parent_id": 1
 }, 
  {
  "id": 4,
  "name": "Slow Deliver",
  "parent_id": 1
 }, 
 {
  "id": 5,
  "name": "Aircon",
  "parent_id": 2
 }, 
 {
  "id": 6,
  "name": "Television",
  "parent_id": 2
 }, 
 {
  "id": 7,
  "name": "UPS",
  "parent_id": [3, 4]
 }, 
 {
  "id": 8,
  "name": "LG support",
  "parent_id": 5
 },
 {
  "id": 9,
  "name": "Toshiba support",
  "parent_id": 6
 }
]
  

Комментарии:

1. это массив или данные JSON? массив, вы можете использовать .find метод… если это JSON, вы бы сначала проанализировали его в объект, а затем использовали .find метод Array

2. Просто быстрый способ показать вам один из возможных способов. json.forEach( d => { if (d.arrayField.length > 1 ? d.arrayField.indexOf(3) > -1 amp;amp; 'do something with 3' || d.arraField.indexOf(4) > -1 amp;amp; 'do something with 4' : 'do nothing' }

Ответ №1:

В структуре данных data.json файла parent_id может быть integer или может быть array of integers .

Пример parent_id в качестве integer :

  {
  "id": 8,
  "name": "LG support",
  "parent_id": 5
 }
  

Пример parent_id в качестве array :

 {
  "id": 7,
  "name": "UPS",
  "parent_id": [3, 4]
 }
  

Однако в вашем коде вы не рассматриваете второй случай (parent_id как array ).

Итак, в if инструкции, в которой вы проводите это сравнение, вы должны добавить or для обработки случаев, когда строка имеет parent_id в виде массива.

Вместо

 if(value.parent_id == parent_id) {
  html_code  = '<option value="' value.id '">' value.name '</option>';
}
  

Вы должны использовать приведенный ниже код, который также обрабатывает массивы (используя функции Array.isArray() и Array.include() ):

 if(value.parent_id == parent_id || 
   (Array.isArray(value.parent_id) amp;amp; value.parent_id.includes( parent_id)))
{
   html_code  = '<option value="' value.id '">' value.name '</option>';
}
  

Вот полный рабочий фрагмент (выбор службы delivery в первом <select> в конечном итоге приведет к появлению UPS опции в третьем <select> ):

(Предупреждение: во фрагменте, чтобы заставить его работать, я переопределил $.getJSON , НЕ копируйте эту часть кода).

 $(document).ready(function(){

 load_json_data('service');

 function load_json_data(id, parent_id)
 {
  console.log('id = '   id   ', parent_id = '   parent_id);
  var html_code = '';
  $.getJSON('data.json', function(data)
  {
   html_code  = '<option value="">Select ' id '</option>';
   
   $.each(data, function(key, value)
   {
   //console.log(key   ' - '   JSON.stringify(value));
    if(id == 'service')
    {
     if(value.parent_id == '0')
     {
      html_code  = '<option value="' value.id '">' value.name '</option>';
     }
    }
    else
    {
     if(value.parent_id == parent_id || (Array.isArray(value.parent_id) amp;amp; value.parent_id.includes( parent_id)))
     {
      html_code  = '<option value="' value.id '">' value.name '</option>';
     }
    }
   });
   $('#' id).html(html_code);
  });

 }

 $(document).on('change', '#service', function(){
  var service_id = $(this).val();
  if(service_id != '')
  {
   load_json_data('item', service_id);
   $('#contact').html('<option value="">Select contact</option>');
  }
  else
  {
   $('#item').html('<option value="">Select item</option>');
   $('#contact').html('<option value="">Select contact</option>');
  }
 });
 $(document).on('change', '#item', function(){
  var item_id = $(this).val();
  if(item_id != '')
  {
   load_json_data('contact', item_id);
  }
  else
  {
   $('#contact').html('<option value="">Select contact</option>');
  }
 });
});  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js">
</script>
<script type="text/javascript">
$.getJSON = function(file, callback){
  var data = [
   {
    "id": 1,
    "name": "Delivery",
    "parent_id": 0
   }, 
   {
    "id": 2,
    "name": "Repair",
    "parent_id": 0
   }, 
   {
    "id": 3,
    "name": "Quick Deliver",
    "parent_id": 1
   }, 
    {
    "id": 4,
    "name": "Slow Deliver",
    "parent_id": 1
   }, 
   {
    "id": 5,
    "name": "Aircon",
    "parent_id": 2
   }, 
   {
    "id": 6,
    "name": "Television",
    "parent_id": 2
   }, 
   {
    "id": 7,
    "name": "UPS",
    "parent_id": [3, 4]
   }, 
   {
    "id": 8,
    "name": "LG support",
    "parent_id": 5
   },
   {
    "id": 9,
    "name": "Toshiba support",
    "parent_id": 6
   }
  ];
  callback(data);
};

</script>
<select id="service"></select>
<select id="item"></select>
<select id="contact"></select>  

Комментарии:

1. Привет, Франциско Нето, спасибо, что ответил на мой вопрос, который я не мог решить в течение 3 дней: D Моим другим обходным путем было изменить все parent_id на array вместо этого.