Процесс выглядит следующим образом:
NodeList Variable
⟶ Array Variable
⟶ JSON.stringify
⟶ JSON.parse
Моя проблема в том, что когда я преобразовываю переменную типа NodeList (в данном случае links
) в массив, а затем заглядываю в содержимое после выполнения JSON.stringify, записи уничтожаются.
Код показывает два теста. Тест 1 показывает, что если начать с массива, то JSON правильно кодирует и декодирует массив объектов. Тест 2 показывает, что если начать с NodeList, а затем преобразовать в массив, то JSON уничтожит содержимое массива.
Вопрос. Почему это происходит? Что я могу сделать, чтобы обеспечить сохранение объектов в NodeList/Array.
Н. B.: Я пробовал это с различными методами преобразования NodeList ⟶ Array, .toArray()
, используя цикл for для добавления элементов в новый массив и используя команду $.makeArray()
jquery
. Во всех случаях возникает одна и та же проблема.
function out() {
var args = Array.prototype.slice.call(arguments, 0);
document.getElementById('output').innerHTML += '' + args.join('') + '\n';
}
out('--- Test 1: Array -> JSON.stringify -> JSON.parse -> Array ---');
var links = [{
href: 'rot',
anzahl: 34
}, {
href: 'blau',
anzahl: 103
}, {
href: 'gruen',
anzahl: 19283
}, {
href: 'grau',
anzahl: 10
}, {
href: 'weiss',
anzahl: 700
}]
//links = $.makeArray(links);
// Already an array. Don't need to convert.
// But it will still work, if one does.
out('Type: ' + typeof links);
out('Variable before JSON: ' + links);
out('An element of the array: ' + links[2]);
out('An entry: [' + links[2].href + ']');
out('');
links = JSON.stringify(links);
out('Variable after JSON: ' + links);
links = JSON.parse(links);
out('Variable after JSON.parse: ' + links);
out('');
out('An element of the array: ' + links[2]);
out('An entry: [' + links[2].href + ']');
out('');
out('--- Test 2: NodeList -> Array -> JSON.stringify -> JSON.parse -> Array ---');
var myNodeList = document.querySelectorAll('a');
out('Type before conversion: ' + typeof links);
// Conversion-Method 1.
/* links = [];
for(var k=0; k<ergebnis.links.length; k++) {
links.push(myNodeList[k]);
}*/
// Conversion-Method 2.
links = $.makeArray(myNodeList);
// Conversion-Methods 1+2 lead to same results.
out('Type: ' + typeof links);
out('Variable before JSON: ' + links);
out('An element of the array: ' + links[2]);
out('An entry: [' + links[2].href + ']');
out('');
links = JSON.stringify(links);
out('Variable after JSON: ' + links);
links = JSON.parse(links);
out('Variable after JSON.parse: ' + links);
out('');
out('An element of the array: ' + links[2]);
out('An entry: [' + links[2].href + ']');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<div>List of Websites in HTML
<p>
<a href="http://www.google.com"> Google</a>
<br>
<a href="http://www.wikipedia.com"> Wikipedia </a>
<br>
<a href="http://www.yahoo.com"> Yahoo! </a>
<br>
<a href="http://www.lbc.co.uk"> LBC </a>
<br>
</p>
</div>
<pre id='output'></pre>
JSON.stringify
. - person Sebastian Simon   schedule 06.01.2017printObj()
(см. ответ в ссылке), похоже, теряют информацию и просто не могут быть расшифрованы через e. g. JSON.parse или другие методы. Обязательно должен быть простой метод преобразования из NodeList в строку/JSON. - person Samot   schedule 06.01.2017