Как я могу использовать строки в Javascript для проверки данных в двух отдельных словарях JSON? - PullRequest
1 голос
/ 04 июня 2011

Мне нужно проанализировать данные из одного файла JSON, чтобы проверить массивы, ключи и значения во втором файле JSON. Например, у меня есть файл JSON, заполненный данными в этом формате:

{ "someData":["array", "key", "value"] }

У меня есть второй файл JSON с такими данными:

{ "fruit": [ {"type":"apple"}, 
             {"type":"cherry"},
             {"type":"pear"} ] }

Что мне нужно сделать, это взять данные из первого файла JSON и использовать их для проверки данных во втором файле JSON. Скажите, что мой JSON "someData" выглядит так:

{ "someData":["fruit", "type", "pear"] }

Как я могу создать прямую функцию JavaScript, чтобы определить, существует ли массив "fruit" во втором словаре JSON, с ключом с именем "type" и значением с именем "pear"? Я предполагаю, что я действительно спрашиваю, как использовать строку из первого словаря JSON для доступа к данным из второго словаря JSON?

Ответы [ 4 ]

0 голосов
/ 04 июня 2011

Ваш вопрос заинтриговал меня, поэтому я попробовал это сделать в jsFiddle.Я думаю, что это должно работать довольно хорошо, и код является несколько кратким (без комментариев).Единственное предостережение в том, что он на самом деле не выполняет никакой проверки типов и может выдавать ошибку, поскольку «someData» не является массивом, если «fruit» не является массивом или если различные элементы в массиве «fruit» не былит правильные объекты.Но я не хотел слишком усложнять код и просто предположил, что вы будете уверены, что формат JSON соответствует вашему примеру.

http://jsfiddle.net/nG7BZ/

var checkFor = {
    "someData": ["fruit", "type", "pear"],
    "someMoreData": ["fruit", "color", "organge"],
    "evenMoreData": ["vegetable", "type", "spinach"],
    "lastBitOfData": ["vegetable", "color", "green"]    
};
var checkIn = {
    "fruit": [
        {"type": "apple", "color": "red"},
        {"type": "cherry", "color": "red"},
        {"type": "pear", "color": "green"}],
    "vegetable": [
        {"type": "broccoli", "color": "green"},
        {"type": "tomato", "color": "red"},]    
};

// Loop through all the keys in checkFor and see they exist in checkIn
for(var name in checkFor) {
    /*
        Keys ( will be "someData, someMoreData, evenMoreData, etc" in no particular order        
        Grab each key (name) of checkFor and assign it to a variable (arr)
        Assign indexes 0, 1, 2 of arr to parentKey, key, value - respectively
    */
    var arr = checkFor[name], parentKey = arr[0], key = arr[1], value = arr[2];    

    // Check to see if for
    var exists = forExistsIn(checkIn, parentKey, key, value);

    // Write out our result
    document.write(name+ " (" + arr + ")  exists in checkIn => " + exists + "<br>");
}

/*
  Checks for the parentKey in obj and then checks
   to make sure obj[parentKey] contains at least 1 sub object whose
   "key" === "value" 
*/
function forExistsIn(obj, parentKey, key, value) {
    return typeof obj[parentKey] !== "undefined"  &&
        obj[parentKey].filter(function(item) {
            return item[key] === value;
        }).length > 0;
}
0 голосов
/ 04 июня 2011

Что-то вроде:

function isArray(o)
{
    if((typeof o) != 'object')
        return false;
    if(o.length == undefined)
        return false;
    return true;
}

var first;
var second;

// read them...

var foundFruit = second[first["someData"][0]];
var aok = isArray(foundFruit);

... и продолжаем проверять, что внутри найден фрукт и так далее?

0 голосов
/ 04 июня 2011

Общая идея состоит в том, чтобы просмотреть элементы массива / свойства объекта и найти соответствующие элементы.

Вот пример, который поможет вам сделать это:

function validate(data, query){
    var currentData = data;
    var counter = 0;
    var foundMatch = false;

    while (counter < query.length){
        foundMatch = false;
        if (currentData instanceof Array){
            // 1. key points to an array
            if (counter < query.length){
                var key = query[counter];
                var i;
                for (i = 0; i < currentData.length; i++){
                    var item = currentData[i];
                    if (counter === query.length - 1){
                        foundMatch = item === query[counter];
                        if (foundMatch){
                            counter++;
                            break;
                        }
                    } else if (item.hasOwnProperty(key)){
                        if (counter < query.length - 2){
                            currentData = item[key];
                            foundMatch = true;
                            counter++;
                        } else {
                            foundMatch = item[key] === query[counter + 1];
                            if (foundMatch){
                                counter += 2;
                                break;
                            }
                        }
                    }

                    if (foundMatch) {
                        break;
                    }
                }
            } else {
                foundMatch = false;
                break;
            }
        } else if (counter === query.length - 1){
            // 2. key points to the last item
            foundMatch = currentData === query[counter];
            counter++;
        } else {
            if (currentData.hasOwnProperty(query[counter])){
            // 3. key points to an object
                currentData = currentData[query[counter]];
                foundMatch = true;
                counter++;
            }
        }
        if (!foundMatch){
            break;
        }
    }

    return foundMatch;
}

var query = ["fruit", "type", "pear"];
var data = {"fruit": [{"type":"apple"}, {"type":"cherry"}, {"type":"pear"} ] };

// some other test data
//var query = ["fruit", "val", "anotherArray", 42];
//var data = {"fruit": [{"type":"apple"}, {"val":{anotherArray:[1,2,42]}}, {"type":"pear"} ] };

console.log(validate(data, query));
0 голосов
/ 04 июня 2011

Вы можете получить доступ к свойству объекта либо напрямую, либо динамически через словарную нотацию (если у вас есть его имя в виде строки):

var j2 = { "fruit": [ {"type":"apple"}, 
             {"type":"cherry"},
             {"type":"pear"} ] };

j2.fruit[0].type = j2["fruit"][0]["type"] = "apple"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...