Разбиение строки на десятимерный массив
Всем привет. Задача следующая: на сайте есть приборы, которые могут быть в разных исполнениях. Например прибор "ЭНИ-701" может быть 2-х канальным, 4-х канальным, 8-ми канальным. В свою очередь 2-х канальный ЭНИ-701 может быть на 10 Вт, 20 Вт. 4-х канальный на 10, 20, 30 Вт. И так далее. Для простоты восприятия:https://cacoo.com/diagrams/v2Qko8L4XGhYKh22
Конфигурация данного прибора задаётся в следующем виде: var str = "ЭНИ-601[2к[10Вт;20Вт];4к[10Вт;20Вт;30Вт];8к[70Вт;80Вт]];" Вложенность может быть ещё больше (то есть ЭНИ-601, 2-к, 10Вт могут быть ещё в разных исполнениях). максимальное число вложенностей достигает 10. Вопрос заключается в следующем: Как обработать данную строку чтобы получить массивы с элементами: arr[0] == "Эни-601"; arr[0][0] == "2к"; arr[0][1] == "4к"; arr[0][2] == "8к"; arr[0][0][0] == "10Вт"; arr[0][0][1] == "20Вт"; arr[0][1][0] == "10Вт"; arr[0][1][1] == "20Вт"; arr[0][1][2] == "30Вт"; arr[0][2][0] == "70Вт"; arr[0][2][1] == "80Вт"; Как можно подобное реализовать? Может я вообще думаю в неправильном направлении и есть менее извращённый способ? |
|
Именно такой массив Вы вряд ли получите. Т.к. если str = "string", то str[0] = str.charCodeAt(0) = "s".
Можно, конечно, извернуться, но лучше не стоит. |
Ну почему же, можно всяко извращаться.)
Например привести к такому виду: var arr = [ { 'toString':function(){return 'ЭНИ-601'}, '0':{ 'toString':function(){return '2к'}, '0':'10Вт', '1':'20Вт' }, '1':{ 'toString':function(){return '4к'}, '0':'10Вт', '1':'20Вт', '2':'30Вт' }, '2':{ 'toString':function(){return '8к'}, '0':'70Вт', '1':'80Вт' } } ]; alert([ arr[0], arr[0][0], arr[0][1], arr[0][2], arr[0][0][0], arr[0][0][1], arr[0][1][0], arr[0][1][1], arr[0][1][2], arr[0][2][0], arr[0][2][1] ].join('\n')) Но, имхо, лучше не извращаться и заглавие просто хранить в нулевом элементе |
Не могу понять используя какой метод можно привести к данному виду.
|
Цитата:
покажу только как, например, можно разобрать твою строку а массив создашь сам var str = "ЭНИ-601[2к[10Вт;20Вт];4к[10Вт;20Вт;30Вт];8к[70Вт;80Вт]];", m, m1, // вспомогательные root = '', arr1 = [], arr2 = []; // результат m = str.match(/([^\[]+)\[(.+)\];/); root = m[1]; m = m[2].match(/\S\S\[[^\[]+\]/g); for (var i = 0; i < m.length; i++) { m1 = m[i].match(/(\S\S)\[([^\[]+)\]/); arr1[i] = m1[1]; arr2[i] = m1[2].split(';'); } alert(root); // здесь первый уровень alert(arr1.join('\n')); // здесь второй уровень [] alert(arr2.join('\n')); // здесь третий уровень [][] вариантов как это сделать много это первое что пришло в голову наверняка кто-нибудь сделает красивый вариант |
Сделал функцию, но имхо вышло как-то криво, сейчас спать, а завтра трезво взгляну.)
function parce(str){ var result=[], i=0, re=/([^\[;]+)\[([^\]\[]+)\]/g, placer = function(a,b,c){ var arr=c.split(';'), j=arr.length; while(j--)if(arr[j].indexOf('array_')===0)arr[j]=result[arr[j].slice(6)]; arr.toString=function(){return b}; result[i]=arr; return 'array_' + i++ } while(~str.indexOf('['))str=str.replace(re,placer) return result[i-1] } var str = "ЭНИ-601[2к[10Вт[вложенность+3[вложенность+4;xxx;zzz];xxx;zzz];20Вт];4к[10Вт;20Вт;30Вт];8к[70Вт;80Вт]];" arr=parce(str) alert( arr+'\n'+ arr[0]+'\n'+ arr[0][0]+'\n'+ arr[0][0][0]+'\n'+ arr[0][0][0][0] ) |
Я добился вывода данных в ассоциативный массив, а сейчас столкнулся с проблемой.
Завёл новую тему Многомерный ассоциативный массив. |
Часовой пояс GMT +3, время: 05:34. |