Поиск по 7 входным критериям, чтобы посмотреть в файл JSON

Я постараюсь объяснить.

У меня есть форма с 7 входами (возраст, страна, город,...) и в файле JSON у меня много людей. Мне нужно искать в этом файле JSON со всеми критериями в форме. Например, Испания и 25 лет.

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

Код ниже:

    <!-- Google Maps -->
<script src="assets/js/jquery.ui.map.full.min.js"></script>
<script src="assets/js/jquery.ui.map.extensions.js"></script>
<script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>
<script type="text/javascript">
  $(function(){
    $('#mapa').gmap({'callback': function() {
      var self = this;
      parsejson = function(arrayvalues){
        $.getJSON( 'mapa.json', function(data) { 
          $.each(arrayvalues, function(x, val) {
            if (val.value !== "") {
              console.log(val.value);
              $.each( data.markers, function(i, marker) {
                console.log('marker ' + marker);
                // PROBLEM IS HERE, DON'T KNOW HOW TO SOLVE



              });
            };
          });

          // Draw markers in map

          // $.each( data.markers, function(i, marker) {
          //   self.addMarker({ 
          //     'position': new google.maps.LatLng(marker.latitude, marker.longitude), 
          //     'bounds': false
          //   }).click(function() {
          //     self.openInfoWindow({'content': marker.content }, this);
          //   });
          // });
        });

      };

      self.getCurrentPosition(function(position, status) {
        if ( status === 'OK' ) {
          var clientPosition = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
          self.addMarker({'position': clientPosition, 'bounds': false});
          self.option('center', clientPosition);
          self.option('zoom', 12);
          self.addShape('Circle', { 
            'strokeColor': "#008595",
            'strokeOpacity': 0.8,
            'strokeWeight': 2,
            'fillColor': "#008595",
            'fillOpacity': 0.35,
            'center': clientPosition,
            'radius': 500,
            'clickable': false
          });
        }
        else {
          console.log("else");
          var clientPosition = new google.maps.LatLng(40.463667, -3.74922);
          self.option('center', clientPosition);
          self.option('zoom', 4);
        }
      });
    }});
  });

  // Search form actions
  $('#searcher-form').submit(function(e) {
    e.preventDefault();
    var $inputs = $(this).serializeArray();

    parsejson($inputs);
  });
</script>
<!-- End of Google Maps -->

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

{"markers":[
{
    "fromcountry":"Spain",
    "fromcity":"San Cristóbal de la Laguna",
    "livecountry":"Spain",
    "livecity":"San Cristóbal de la Laguna",
    "age":25,
    "profession":"Diseñador"
    "title":"La Laguna",
    "latitude":28.469294910391532,
    "longitude":-16.329975128173828,
    "content":"Mooola"
},
{
    "fromcountry":"Spain",
    "fromcity":"Madrid",
    "livecountry":"Spain",
    "livecity":"Santa Crus de Tenerife",
    "age":30,
    "profession":"Programador"
    "title":"Los Majuelos",
    "latitude":28.44038127509586,
    "longitude":-16.311674416065216,
    "content":"Mooola"
}

]}

Массив из формы возвращает мне это:

Object {name: "regsearchcountry", value: "whatever"}
Object {name: "regsearchcity", value: "whatever"}
Object {name: "regsearchlivecountry", value: ""}
Object {name: "regsearchlivecity", value: "whatever"}
Object {name: "regsearchagefrom", value: ""}
Object {name: "regsearchageto", value: "whatever"}
Object {name: "regsearchprofession", value: ""} 

И мне нужно объединить поля формы с некоторыми полями в JSON, а не со всеми данными. Поэтому мне нужно сравнить все эти поля формы с JSON, а в случае, если одно пустое, сравнить остальные.

2 ответа

Вам просто нужно пройтись по записям в файле json и сравнить каждую запись с вашей входной записью.

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

Если вы ищете точное совпадение, вы можете ускорить процесс, перейдя к следующей записи, как только одно поле не совпадет.

var records = [
    { name : 'bob', age : 22 },
    { name : 'john', age : 32 }
    /* lots of other records */
];

var input = {
    name : 'john',
    age : 32
};


var compare, match, result;

    // loop through all the records
for(var i = 0, len = records.length; i < len; i++) {

    compare = records[i];

    match = true;

            // loop through each property (name, age etc)
    for(prop in input) {

                    // as soon as something is wrong, break out and try the next one
        if(input[prop] !== compare[prop]) { 

            match = false;
            break;

        }

    }

            // if we got through without anything being wrong, we found the result!
    if(match) {

        result = compare;
        break;

    }

}

// result should be set to a matching result

Используйте linq.js Вот пример, скопированный с http://linqjs.codeplex.com/

var jsonArray = [
    { "user": { "id": 100, "screen_name": "d_linq" }, "text": "to objects" },
    { "user": { "id": 130, "screen_name": "c_bill" }, "text": "g" },
    { "user": { "id": 155, "screen_name": "b_mskk" }, "text": "kabushiki kaisha" },
    { "user": { "id": 301, "screen_name": "a_xbox" }, "text": "halo reach" }
]
// ["b_mskk:kabushiki kaisha", "c_bill:g", "d_linq:to objects"]
var queryResult = Enumerable.From(jsonArray)
    .Where(function (x) { return x.user.id < 200 })
    .OrderBy(function (x) { return x.user.screen_name })
    .Select(function (x) { return x.user.screen_name + ':' + x.text })
    .ToArray();
// shortcut! string lambda selector
var queryResult2 = Enumerable.From(jsonArray)
    .Where("$.user.id < 200")
    .OrderBy("$.user.screen_name")
    .Select("$.user.screen_name + ':' + $.text")
    .ToArray();
Другие вопросы по тегам