Как извлечь значения из строки в 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 ]

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

Давайте напишем парсер!

function parse(input)
{
    function parseSingle(input)
    {
        var parts = input.split('||'),
            part,
            record = {};

        for (var i=0; i<parts.length; i++)
        {
            part = parts[i].split('=');
            record[part[0]] = part[1];
        }

        return record;
    }

    var parts = input.split('++'),
        records = [];

    for (var i=0; i<parts.length; i++)
    {
        records.push(parseSingle(parts[i]));
    }

    return records;
}

Использование:

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

var parsed = parse(string);
/* parsed is:
[{id: "1", price: "500", name: "Item name", shipping: "0", quantity: "2"},
 {id: "2", price: "1500", name: "Some other name",  shipping: "10", quantity: "2"}]
*/
2 голосов
/ 09 сентября 2011

Сначала разделите вашу строку на две (или более) части с помощью разделителя ++:

var strings = myString.split('++');

, а затем для каждой из строк вы хотите объект, верно?Итак, вам нужно иметь массив и заполнить его так:

var objects = [];

for (var i = 0; i < strings.length; ++i) {
    var properties = strings[i].split('||');
    var obj = {};
    for (var j = 0; j < properties.length; ++j) {
          var prop = properties[j].split('=');
          obj[prop[0]] = prop[1]; //here you add property to your object, no matter what its name is
    }
    objects.push(obj);
}

, таким образом, у вас есть массив всех объектов, созданных из вашей строки.Естественно, в реальной жизни я бы добавил несколько проверок, чтобы строки действительно удовлетворяли формату и т. Д. Но идея ясна, я надеюсь.

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

Вы можете достичь этого с помощью регулярных выражений.Например, регулярное выражение /price=([0-9]+)/ будет соответствовать price=XXX, где XXX - это одно или несколько чисел.Поскольку эта часть регулярного выражения заключена в круглые скобки, она явно захватывает для вас числовую часть.

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

var priceRegex = /price=([0-9]+)/
var match = string.match(priceRegex);
console.log(match[1]); // writes 500 to the console log

Пример в реальном времени: http://jsfiddle.net/heQC8/

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

Попробуйте это:

var string = 'id=1||price=500||name=Item name||shipping=0||quantity=2++id=2||price=1500||name=Some other name||shipping=10||quantity=2';
var obj = new Array();
var arr = string.split('||');
for(var x=0; x<arr.length;x++){
    var temp = arr[x].split('=');
    obj[temp[0]] = temp[1]
}

alert(obj['id']); // alert 1
1 голос
/ 09 сентября 2011

Если вам нравятся глазные конфеты в вашем коде, вы можете использовать трюк "искать и не заменять" на основе регулярных выражений Джона Резига ( кешируется здесь ):

var extract = function(string) {
    var o = {};

    string.replace(/(.*?)=(.*?)(?:\|\||$)/g, function(all, key, value) {
        o[key] = value;
    });

    return o;
};

Тогда

var objects = string.split('++'), 
    i = objects.length;

for (;i--;) {
    objects[i] = extract(objects[i]);
}
1 голос
/ 09 сентября 2011

Если вы можете использовать jQuery, он оборачивает работу с файлами cookie и позволяет получить к ним доступ, например:

Чтение печенья: var comments = $ .cookie ('comments');

Написание куки: $ .cookie («комментарии», «расширенные»);

У этого поста кто-то еще есть достойный пример: http://www.vagrantradio.com/2009/10/getting-and-setting-cookies-with-jquery.html

Если вы не можете использовать jQuery, вам нужно выполнить стандартный синтаксический анализ строк, как в настоящее время (возможно, регулярные выражения вместо разделения / замены строк могут обрезать ваш код) или найти какую-то другую библиотеку javascript, которую вы можете использовать.

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

Это должно получить первое совпадение в строке:

string.match(/price=(\d{1,})/)[1]

Обратите внимание, что это будет соответствовать только первой цене = в строке, а не второй.

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

Вы уже используете .split (), чтобы разбить строку на ||просто сделайте этот шаг дальше и разделите каждый из этих разделов на = и присвойте всему левому полю и правому значению

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

Я бы прикрепил данные к объекту javascript.

  var settingsObj = {};
  var components = thatString.split('||');

  for(var j = 0; j < components.length; j++)
  {
       var keyValue = components[j].split('=');

       settingsObj[keyValue[0]] = keyValue[1];
  }

  // Now the key value pairs have been set, you can simply request them

  var id = settingsObj.id; // 1 or c1
  var name = settingsObj.name; // Item Name, etc
1 голос
/ 09 сентября 2011

Если вы можете заменить || на &, вы можете попытаться проанализировать его, как если бы это была строка запроса . Личное примечание - с данными в формате JSON было бы легче работать.

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