2016-10-02 2 views
3

Я пытаюсь выполнить операции (обновлять значения, удалять ключи, добавлять ключи и т. Д.) В данные JSON, о которых я ничего не знаю. Эти элементы являются файлами свойств, а не данными JSON, возвращаемыми из приложения. Эти файлы могут быть очень разными, и мне нужно разработать метод, который может выполнять эти операции, ничего не зная о данных JSON.Итерация через весь объект JSON без знания каких-либо ключей

Я отслеживаю путь, где хранится ключ. Если бы у меня были образцы данных, как показано ниже, я бы сохранил путь, как '/ key1/innerKey5 /', и получить данные с ключом innerKey6, используя getNodeData.

Если у меня есть путь и ключ элемента, как я могу программно найти этот элемент в данных JSON и удалить или обновить элемент?

var originalData = someMethodToGetJSONData(); 
var currentData; // Global variable storing a copy of the original data which can be modified 

json = { 
    "key1": { 
    "innerKey1": { 
     "innerKey2" : { 
     "innerKey3": "value1", 
     "innerKey4": "value2" 
     } 
    }, 
    "innerKey5": { 
     "innerKey6": "value1" 
    } 
    }, 
    "key2": "value3", 
    "key3": "value4" 
} 

function getKeysFromPath(keyPath) { 
    var split = keyPath.split('/'); 
    var keys = []; 

    for(var i = 0; i < split.length; i++) { 
    if(split[i] != '') { 
     keys.push(split[i]); 
    } 
    } 

    return keys 
} 

function getNodeData(keyPath) { 
    var keys = getKeysFromPath(keyPath); 
    nodeData = currentItemData; 

    for(var i = 0; i < keys.length; i++) { 
    nodeData = nodeData[keys[i]]; 
    } 

    return nodeData; 
} 

data = getNodeData('/key1/innerKey5/'); 
key = 'innerKey6'; 
console.log('Data: ' + data[key]); 
+1

мозоль: объект JSON имеет только два свойства: '' parse' и stringify'. У вас есть * JavaScript-объект * или просто объект *, а не объект JSON. – Amadan

+0

Посмотрите на использование [Object.keys()] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) – charlietfl

+0

@Amadan Вы правы, спасибо. –

ответ

0

У Lodash есть полезная функция для такого рода вещей.

_.get, _.set, _.unset

Так что, если вы храните узел в виде строки формы, например. -> a.b.c [0] .k, эти 3 функции должны быть способны делать то, что вы хотите.

+0

Это выглядит как самый быстрый и простой вариант. Благодарю. –

0

Если вы используете JQuery, используйте функцию .each():

$.each(json,function(key,val){ 
     //You may use key/val for every iteration 
}); 
0

Для того, чтобы обновить или удалить, вам необходимо получить родительский объект и последний ключ:

var lastKey = keys.pop(); 
var parentObj = getNodeByKeys(keys); // refactor your code to make this function 
parentObj[lastKey] = newValue; 
delete parentObj[lastKey]; 
1

Это пример того, как перебрать неизвестных ключей

var key; 

for (key in arr) { 
    if (arr.hasOwnProperty(key)) { 
    console.log(key); 
    console.log(arr[key]); 
    } 
} 
0

Получить данные через XHR и синтаксического анализа JSON:

var getJSON = function(url) { 
    return new Promise(function(resolve, reject) { 
     var xhr = new XMLHttpRequest(); 
     xhr.open('get', url, true); 
     xhr.onload = function() { 
      var status = xhr.status; 
      if (status == 200) { 
       resolve(JSON.parse(xhr.response)); 
      } else { 
       reject(status); 
      } 
     }; 
     xhr.send(); 
    }); 
}; 

затем использовать JQuery each:

getJSON('//yoursite.com/yourfile.json').then(function(data) { 
    $.each(data, function(k, v) { 
     console.log(k + ', ' + v); 
    }); 
}, function(status) { 
    console.log(status); 
}); 
+0

, если вы собираетесь бросать jQuery только для использования 'each', почему бы не использовать' $ .getJSON' также? – charlietfl

+0

Правда. Я нахожу, что родной JS XHR - простой кросс-браузер (wES6-прокладка), но нашел итерационные объекты, нетривиальные в родной JS. Поэтому '$ .each' - это простой кросс-браузер. Мое предпочтение - родной JS, вот и все. –

+0

В native JS вы можете сделать: 'Object.keys (json) .forEach (function (key) {});'. Почти то же, что и jQuery. –

0

Вы можете получить данные с «пути», используя эту функцию:

/** 
* Get a node from an object according to the given path. 
* @param {String} path Node's path. 
* @param {Object} data Object to retrieve the desired information. 
* @returns {Object} Returns the value from the node, or null in the 
* case the node is not found. 
*/ 
function getNode(path, data) 
{ 
    var currentNode = data; 

    path.replace(/^\/|\/$/g, '').split('/').forEach(function(key){ 
     if(key in currentNode) 
     { 
      currentNode = currentNode[key]; 
     } 
     else 
     { 
      currentNode = null; 
      return false; 
     } 
    }); 

    return currentNode; 
} 

Оттуда вы могли бы манипулировать ваш объект, как это:

var myData = { 
    "key1": { 
     "innerKey1": { 
      "innerKey2" : { 
       "innerKey3": "value1", 
       "innerKey4": "value2" 
      } 
     }, 
     "innerKey5": { 
      "innerKey6": "value1" 
     } 
    }, 
    "key2": "value3", 
    "key3": "value4" 
}; 

var someNode = getNode('/key1/innerKey5', myData); 

// add value 
someNode.innerKey7 = 'newValue'; 

// update existing value 
someNode.innerKey7 = 'otherValue'; 

// delete value 
delete someNode.innerKey6; 

console.log(myData); 
Смежные вопросы