Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.11.2011, 10:01
Интересующийся
Отправить личное сообщение для cbone Посмотреть профиль Найти все сообщения от cbone
 
Регистрация: 19.11.2011
Сообщений: 11

Разбиение строки на десятимерный массив
Всем привет. Задача следующая: на сайте есть приборы, которые могут быть в разных исполнениях. Например прибор "ЭНИ-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Вт";


Как можно подобное реализовать? Может я вообще думаю в неправильном направлении и есть менее извращённый способ?
Ответить с цитированием
  #2 (permalink)  
Старый 19.11.2011, 10:49
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

http://javascript.ru/String/match
Ответить с цитированием
  #3 (permalink)  
Старый 19.11.2011, 13:26
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Именно такой массив Вы вряд ли получите. Т.к. если str = "string", то str[0] = str.charCodeAt(0) = "s".
Можно, конечно, извернуться, но лучше не стоит.
Ответить с цитированием
  #4 (permalink)  
Старый 19.11.2011, 14:00
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Ну почему же, можно всяко извращаться.)

Например привести к такому виду:
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'))

Но, имхо, лучше не извращаться и заглавие просто хранить в нулевом элементе
__________________
29375, 35

Последний раз редактировалось Aetae, 19.11.2011 в 15:22.
Ответить с цитированием
  #5 (permalink)  
Старый 21.11.2011, 13:37
Интересующийся
Отправить личное сообщение для cbone Посмотреть профиль Найти все сообщения от cbone
 
Регистрация: 19.11.2011
Сообщений: 11

Не могу понять используя какой метод можно привести к данному виду.
Ответить с цитированием
  #6 (permalink)  
Старый 21.11.2011, 15:10
Лаборант :-)
Отправить личное сообщение для Pavel M. Посмотреть профиль Найти все сообщения от Pavel M.
 
Регистрация: 08.11.2011
Сообщений: 806

Сообщение от cbone
Не могу понять используя какой метод можно привести к данному виду.
такой как у тебя массив получить без извращений трудно
покажу только как, например, можно разобрать твою строку
а массив создашь сам
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')); // здесь третий уровень [][]


вариантов как это сделать много
это первое что пришло в голову
наверняка кто-нибудь сделает красивый вариант
Ответить с цитированием
  #7 (permalink)  
Старый 22.11.2011, 02:51
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Сделал функцию, но имхо вышло как-то криво, сейчас спать, а завтра трезво взгляну.)
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]
)
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 23.11.2011, 08:15
Интересующийся
Отправить личное сообщение для cbone Посмотреть профиль Найти все сообщения от cbone
 
Регистрация: 19.11.2011
Сообщений: 11

Я добился вывода данных в ассоциативный массив, а сейчас столкнулся с проблемой.
Завёл новую тему Многомерный ассоциативный массив.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видимость строки таблицы sslab Events/DOM/Window 8 04.12.2011 21:58
как запихнуть в массив оператор ? mitiya Общие вопросы Javascript 2 09.02.2011 18:57
Массив объектов или объект объектов vladlen Общие вопросы Javascript 19 30.10.2010 03:10
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 23:30