Как лучше сравнить значения объекта JSON с фиксированным массивом в JScript - PullRequest
0 голосов
/ 23 ноября 2018

Я хотел бы сравнить значения JSON с массивом значений, но я не знаю, каков наилучший сценарий.

Я получил объект JSON с ожидаемыми значениями (может иметь 1 значение, 2или более) У меня есть функция DB, которая возвращает фиксированное число значений, скажем, 10 значений все время, и я хотел бы знать, совпадают ли мои значения JSON с правильными значениями, поступающими из DB.Пример:

Моя переменная JSON:

 var expValues = {
            "id": "123",
            "age": 23
        };

Моя БД будет помещать некоторые значения в массив объектов.

Пример:

    if ((rs.BOF) && (rs.EOF))
    {
        //nothing found;
    }
    else
    {
        while (!rs.EOF)
        {
            aDetails.push(
            {
                "id": rs.fields("id").Value,
                "name": rs.fields("name").Value,
                "age": rs.fields("age").Value,
                "sex": rs.fields("sex").Value,
                "hobby": rs.fields("hobby").Value
            });
            rs.MoveNext();
        }
    }
     rs.close;
 //Close connection then return
 return aDetails;

в основном я хочу убедиться, что значения из JSON совпадают с правильными значениями из DB.(идентификатор например).

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Это универсальный способ индексации списка объектов для быстрого поиска с любой конфигурацией свойств.

// javascript version
function makeIndex (arrayOfObject, listOfPropertyToIndex) {
  var index = {};

  index.objToKey = function (o) {
    var key = [];
    listOfPropertyToIndex.forEach((p) => {
      key.push(""+o[p]);
    });
    return key.join("_");
  };

  arrayOfObject.forEach((o) => {
    index[objToKey(o)] = o;
  });

  index.match = function (object) {
    var key = index.objToKey(object);
    if (index.hasOwnProperty(key)) {
      return index[key];
    };
    return null;
  });

  return index;
}

// jscript version
function makeIndex (arrayOfObject, listOfPropertyToIndex) {
  var index = {};

  index.objToKey = function (o) {
    var key = [];
    for (var p in o) {
      if (o.hasOwnProperty(p)) {
        key.push(""+o[p]);
      }
    }
    return key.join("_");
  };

  for (var i = 0; i < arrayOfObject.length; ++i) {
    index[objToKey(arrayOfObject[i])] = o;
  } 

  index.match = function (object) {
    var key = index.objToKey(object);
    if (index.hasOwnProperty(key)) {
      return index[key];
    };
    return null;
  });

  return index;
}

Вот как это использовать

var expValues = {
        "id": "123",
        "age": 23
    };

var index = makeIndex(aDetails, ["id","age"]);

var obj = index.match(expValues);
if (obj) {
   ... obj ...
}

var index_name = makeIndex(aDetails, ["name"]);

var person = {"name":"as2"};

var obj2 = index_name.match(person);
if (obj2) {
   ... obj2 ...
}
0 голосов
/ 23 ноября 2018

Я предположил, что aDetails имеет что-то вроде данных ниже.

let aDetails = [{
  "id": "123",
   "name": "as",
   "age": 23,
   "sex": "m",
   "hobby": "abc"
}, {
  "id": "1234",
   "name": "as1",
   "age": 23,
   "sex": "m",
   "hobby": "abc"
}, {
  "id": "12",
   "name": "as2",
   "age": 23,
   "sex": "m",
   "hobby": "abc"
}]

var expValues = {
            "id": "123",
            "age": 23
        };
        
function isObjectMatched(obj) {
  return aDetails.some(d => Object.entries(obj).every(([k, v]) => d[k] == v))
}

console.log(isObjectMatched(expValues))
...