Как извлечь значения из строки в JavaScript? - PullRequest
0 голосов
/ 09 сентября 2011

Мне нужна помощь в извлечении значений из файла cookie с использованием JavaScript.

Строка в файле cookie выглядит примерно так:

string = 'id=1||price=500||name=Item name||shipping=0||quantity=2++id=2||price=1500||name=Some other name||shipping=10||quantity=2'

При использовании string.split () и string.replace () и какой-то уродливый код, который мне каким-то образом удалось получить нужные мне значения (цена, имя, доставка, количество).Но проблема в том, что иногда не все строки в cookie одинаковы.Иногда жало в cookie будет выглядеть примерно так:

   string = 'id=c1||color=red||size=XL||price=500||name=Item name||shipping=0||quantity=2++id=c1||price=500||name=Item name||shipping=0||quantity=2'

с некоторыми элементами, имеющими цвет и размер в качестве параметров, а иногда только с одним из них.

Есть ли более эффективный способобъясните моему компьютеру, что я хочу, чтобы часть строки после 'price =' была переменной с именем 'price' и т. д.

Надеюсь, у меня есть смысл, я пытался быть настолько точным, насколько яМогут.

В любом случае, спасибо за любую помощь

РЕДАКТИРОВАТЬ: Я просто хотел сказать спасибо всем великим людям StackOverflow за такие замечательные идеи.Из-за всех твоих замечательных предложений я собираюсь напиться сегодня вечером.Спасибо всем:)

Ответы [ 13 ]

0 голосов
/ 09 сентября 2011
JSON.parse('[{' + string.replace(/\+\+/g, '},{').replace(/(\w*)=([\w\s]*)/g, '"$1":"$2"').replace(/\|\|/g, ',') + '}]')

Преобразовать строку в формат JSON, а затем проанализировать ее.

0 голосов
/ 09 сентября 2011

Вы могли бы сделать что-то вроде этого, где вы оцениваете строки, когда разделяете их.

<html>
<head>
<script type="text/javascript">
var string = 'id=c1||color=red||size=XL||price=500||name=Item name||shipping=0||quantity=2++id=c1||price=500||name=Item name||shipping=0||quantity=2'


var mySplitResult = string.split("||");

for(i = 0; i < mySplitResult.length; i++){
    document.write("<br /> Element " + i + " = " + mySplitResult[i]); 
    var assignment = mySplitResult[i].split("=");

    eval(assignment[0] + "=" + "\""+assignment[1]+"\"");
}
document.write("Price : " + price);
</script>
</head>
<body>
</body>
</html>
0 голосов
/ 09 сентября 2011
var str = 'id=c1||color=red||size=XL||price=500||name=Item name||shipping=0||quantity=2++id=c1||price=500||name=Item name||shipping=0||quantity=2'
var items = str.split("++");
for (var i=0; i<items.length; i++) {
    var data = items[i].split("||");
    for (var j=0; j<data.length; j++) {
        var stuff = data[j].split("=");
        var n = stuff[0]; 
        var v = stuff[1];
        eval("var "+n+"='"+v+"'");
    }
    alert(id);
}

РЕДАКТИРОВАТЬ: Согласно предложению JamieC, вы можете исключить eval("var "+n+"='"+v+"'"); и заменить его на (несколько) более безопасный window[n] = v; - но у вас все еще есть простая проблема, что это перезапишет существующие переменные, не говоря уже о том, что вы не можете сказать, была ли переменная color установлена ​​на этой итерации или эта пропустила ее, а последняя установила. Создание пустого объекта перед циклом и заполнение его внутри цикла (как предлагает любой другой ответ) - лучший подход почти во всех отношениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...