Как проверить, есть ли данные уже в массиве в javascript?

#javascript #bing-maps #bing #bing-api

Вопрос:

Я работаю над проектом JavaScript с использованием API Bing-карт. Цель проекта-поиск предприятий в области пользователя, а затем печать их имен и номеров телефонов на экране. У Bing есть ограничение в 25 поисковых запросов по определенной области, поэтому мне приходится постоянно перемещать целевой квадрат, чтобы он получал новые результаты. Проблема в том, что очень часто целевые квадраты перекрываются, и веб-сайт добавляет в массив те же предприятия, которые он уже добавлял ранее. Я пытался использовать почти все функции javascript для проверки наличия дубликатов в массиве, но, несмотря ни на что, он продолжает добавлять дубликаты в массив, и ничто не может его остановить.

 function GeocodeCallback(response) {
  var output = document.getElementById('output');
  let used = [] //Array for posted numbers

  //Chech if phone number has been already posted
  function HasDuplicate(object) {
    for (let i = 0; i < used.length; i  ) {
      if (used[i] == object) {
        return true
      }
    }
    return false
  }

  if (response amp;amp;
    response.resourceSets amp;amp;
    response.resourceSets.length > 0 amp;amp;
    response.resourceSets[0].resources) {

    var results = response.resourceSets[0].resources;

    let html = ['<table>'];
    //PROBLEM AREA ----------------------------------------------------------------------------------------
    for (var i = 0; i < results.length; i  ) {
      console.log("Phone "   results[i].PhoneNumber   "Name "   results[i].name)
      if (!HasDuplicate(results[i].PhoneNumber)) {
        console.log("Not Duplicate")
        html.push('<tr><td>'   results[i].name   '</td><td>'   results[i].PhoneNumber   '</td></tr>'); //<td>', results[i].Website, '</td>
        data  = results[i].PhoneNumber   " , "   results[i].name   "n" //Save Data into file
        used.push(results[i].PhoneNumber)
      } else {
        console.log("IsDuplicate "   results[i].name)
      }
    }
    //PROBLEM AREA ----------------------------------------------------------------------------------------
    html.push('</table>');
    output.innerHTML  = html.join('');
  } else {
    output.innerHTML = "No results found.";
  }
} 

Когда я запускаю этот код, 99% номеров, которые он печатает, по его словам, не являются дубликатами, хотя они есть, но есть 1% телефонных номеров, которые помечены как дубликаты и не добавлены в массив. Таким образом, мой код способен определить, является ли он дубликатом или нет, но по какой-то причине он делает это не в 100% случаев. Я неправильно выполнил проверку или это проблема с данными карт Bing ?

Вот мой полный код, если вы хотите попытаться воспроизвести проблему. Спасибо, что уделили время чтению этого поста, любая помощь будет оценена по достоинству.

 var map, searchManager;
var BingMapsKey = 'AuV6Kc6hF3yFNL_DXFTDGuSu9DCdIK8zYF208z0eNdqbXtt87UHslIKJ70900Wbj';
let data = "" //String to store data that will be saved 
let userLat, userLong, updatedLat, updatedLong

function GetMap() {
  map = new Microsoft.Maps.Map('#myMap', {
    credentials: BingMapsKey
  });

  //Load the spatial math module
  Microsoft.Maps.loadModule("Microsoft.Maps.SpatialMath", function() {
    //Request the user's location
    navigator.geolocation.getCurrentPosition(function(position) {
      var loc = new Microsoft.Maps.Location(position.coords.latitude, position.coords.longitude);
      userLat = position.coords.latitude
      userLong = position.coords.longitude
      updatedLat = userLat   0.05
      updatedLong = userLong   0.05
      geocode()
      //Create an accuracy circle
      var path = Microsoft.Maps.SpatialMath.getRegularPolygon(loc, position.coords.accuracy, 36, Microsoft.Maps.SpatialMath.Meters);
      var poly = new Microsoft.Maps.Polygon(path);
      map.entities.push(poly);

      //Add a pushpin at the user's location.
      var pin = new Microsoft.Maps.Pushpin(loc);
      map.entities.push(pin);

      //Center the map on the user's location.
      map.setView({
        center: loc,
        zoom: 17
      });
    });
  });
}



function geocode() {
  var query = document.getElementById('input').value;

  //Move around the map and get locations from specific square
  for (let x = 0; x < 10; x  ) {
    const longlat = [userLat, userLong, updatedLat, updatedLong]
    var geocodeRequest = "http://dev.virtualearth.net/REST/v1/LocalSearch/?query="   encodeURIComponent(query)   "amp;userMapView="   encodeURIComponent(longlat)   "amp;maxResults=25amp;jsonp=GeocodeCallbackamp;key="   BingMapsKey;
    CallRestService(geocodeRequest, GeocodeCallback);
    userLat  = 0.05
    userLong  = 0.05
    updatedLat  = 0.05
    updatedLong  = 0.05
  }
}

function GeocodeCallback(response) {
  var output = document.getElementById('output');
  let used = [] //Array for posted numbers

  //Chech if phone number has been already posted
  function HasDuplicate(object) {
    for (let i = 0; i < used.length; i  ) {
      if (used[i] == object) {
        return true
      }
    }
    return false
  }

  if (response amp;amp;
    response.resourceSets amp;amp;
    response.resourceSets.length > 0 amp;amp;
    response.resourceSets[0].resources) {

    var results = response.resourceSets[0].resources;

    let html = ['<table>'];
    //PROBLEM AREA ----------------------------------------------------------------------------------------
    for (var i = 0; i < results.length; i  ) {
      console.log("Phone "   results[i].PhoneNumber   "Name "   results[i].name)
      if (!HasDuplicate(results[i].PhoneNumber)) {
        console.log("Not Duplicate")
        html.push('<tr><td>'   results[i].name   '</td><td>'   results[i].PhoneNumber   '</td></tr>'); //<td>', results[i].Website, '</td>
        data  = results[i].PhoneNumber   " , "   results[i].name   "n" //Save Data into file
        used.push(results[i].PhoneNumber)
      } else {
        console.log("IsDuplicate "   results[i].name)
      }
    }
    //PROBLEM AREA ----------------------------------------------------------------------------------------

    html.push('</table>');


    output.innerHTML  = html.join('');


  } else {
    output.innerHTML = "No results found.";
  }
}

let WriteToFile = () => {

  // Convert the text to BLOB.
  const textToBLOB = new Blob([data], {
    type: 'text/plain'
  });
  const sFileName = 'formData.txt'; // The file to save the data.

  let newLink = document.createElement("a");
  newLink.download = sFileName;

  if (window.webkitURL != null) {
    newLink.href = window.webkitURL.createObjectURL(textToBLOB);
  } else {
    newLink.href = window.URL.createObjectURL(textToBLOB);
    newLink.style.display = "none";
    document.body.appendChild(newLink);
  }

  newLink.click();
}

function CallRestService(request) {
  var script = document.createElement("script");
  script.setAttribute("type", "text/javascript");
  script.setAttribute("src", request);
  document.body.appendChild(script);
} 
 #myMap {
  width: 600px;
  height: 600px;
  position: relative;
  margin: auto;
  width: 60%;
  padding: 10px;
}

#center {
  margin: auto;
  width: 60%;
  padding: 10px;
}

#search,
#output {
  margin-left: 20%;
}

.form-control {
  margin: 0 20%;
}

#space {
  margin-left: 17%;
} 
 <!DOCTYPE html>
<html>

<head>
  <title>Business Search</title>
  <meta charset="utf-8" />
  <link rel="stylesheet" href="style.css">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384- 0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7 AMvyTG2x" crossorigin="anonymous">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds 3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
  <script src="script.js"></script>
  <script type='text/javascript' src='http://www.bing.com/api/maps/mapcontrol?callback=GetMap' async defer></script>
</head>

<body>
  <div id="myMap"></div>

  <h1 class="display-4" id="center">Search for business: </h1>

  <div class="input-group mb-3">
    <input type="text" id="input" class="form-control" value="car">
  </div>

  <button type="button" class="btn btn-outline-dark btn-large" id="search" value="Search" onClick="geocode()">Search</button>
  <button type="button" class="btn btn-outline-dark btn-large" value="Save" onClick="WriteToFile()">Save</button>

  <div id="output">Name<span id="space">Phone Number</span></div>
</body>

</html> 

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

1. Вы имеете в виду массив.прототип.включает в себя? Или .find ?

2. Я попытался проверить с помощью .includes, но он все еще продолжает печатать результаты в массив. Я также пытался использовать indexOf и findIndex, но ни один из них не работает. Я собираюсь попробовать использовать . найдите прямо сейчас, я еще не пробовал этого

3. Вы уверены, что они действительно дубликаты? Могут быть различия в пробелах или знаках препинания.

4. Посмотрите console.log(used) , действительно ли они дубликаты.

5. Ну вот почему я проверяю с помощью номера телефона, потому что Bing форматирует все номера одинаково, но да, я уверен, что они дубликаты, потому что на экране отображается точно такое же имя и тот же номер телефона, хотя в моем коде ничего не должно отображаться на экране

Ответ №1:

Массив, используемый для отслеживания дубликатов, инициализируется повторно для каждого отдельного выполнения ваших запросов.

 function GeocodeCallback(response) {
  var output = document.getElementById('output');
  let used = [] //<------ This is initialized every time a new result set is arrived
  ...
 

Это означает, что он не будет отслеживать дубликаты при нескольких вызовах, потому что он всегда теряет номера предыдущего вызова.

Массив должен быть определен вне обратного вызова:

 let used = [] //Array for posted numbers

function GeocodeCallback(response) {
  var output = document.getElementById('output');
   ...
 

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

1. Да, в этом и была проблема, она сработала, большое вам спасибо за ваш ответ