2016-03-03 2 views
0

Я пытаюсь извлечь идентификаторы пользователей из строки, сериализованной формы, вот что я до сих пор.Выберите некоторые элементы из массива с помощью javascript

Возьмите

var dataString = "viewUsers_length=10&id%5B%5D=8163&id%5B%5D=8188&id%5B%5D=8141"

в качестве примера строки.

Я разбить его на массив как этот

var arrStr = dataString.split(/[=&]/); 

что приводит к массиву

[0]viewUsers_length 
[1]10 
[2]id%5B%5D 
[3]8163 
[4]id%5B%5D 
[5]8188 
[6]id%5B%5D 
[7]8141 

Но я хочу только идентификаторы (8163, 8188, 8141)

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

+0

быстрые и грязные исправить: из второго случая массива толчка на новом массиве каждого Эль, которые имеют нечетный индекс. Но синтаксический анализ парфюма мог бы быть сделан по-любимому способом. –

+0

Это может быть * overkill *, но я взломал функцию для синтаксического анализа строк запроса некоторое время назад. Если вы передадите свой 'dataString' в мой метод' parseQuery', вы получите объект, тогда вы можете просто получить свойство 'id'. https://gist.github.com/NTICompass/3528917 –

ответ

0

Есть несколько способов для решения этой проблемы. Первый способ, который я использовал бы, - совместить идентификаторы с регулярным выражением.

var ids = dataString.match(/id%5B%5D=[0-9]+/g); 

Что бы привести к

["id%5B%5D=8163", "id%5B%5D=8188", "id%5B%5D=8141"] 

Так что теперь у нас есть ценности, но мы хотим только числовые части. Так что давайте использовать map, чтобы удалить остальное

ids = ids.map(function (id) { 
    return id.replace('id%5B%5D=', ''); 
}); 

Другой способ будет просто фильтровать на массиве вы уже построен, но вы можете видеть, что у вас есть 10 во второй индекс, который вернется в качестве false, поэтому я думаю, что это обеспечит более чистый набор данных

+0

спасибо, это решение, с которым я пошел, и он работает отлично. – bjjrolls

+0

Привет, рад, что это сработало для вас –

0

Фильтровать массив.

Есть родные способы JavaScript с использованием Array.prototype.filter()

var dataString = "viewUsers_length=10&id%5B%5D=8163&id%5B%5D=8188&id%5B%5D=8141" 
var arrStr = dataString.split(/[=&]/); 

var tester = /\d{4}/; 

arrStr.filter(function (item) { 
    return tester.test(item); 
}); 

/* 
viewUsers_length 
10 
id%5B%5D 
8163    -Match 
id%5B%5D 
8188    -Match 
id%5B%5D 
8141    -Match 
*/ 

Как и JQuery способы с использованием $().filter()

+0

спасибо за ваш ответ, после некоторого чтения я под .filter() теперь лучше. – bjjrolls

0

Я бы разделил на символы «&», а затем сопоставлял функцию, чтобы удалить все до «=» и, наконец, фильтр для удаления элементов, которые не являются идентификаторами элементы. Моя подстрочная функция немного грубая и может быть улучшена (или заменена регулярным выражением) с более глубоким знанием возможных значений.

dataString 
    .split("&") 
    .map(function(elt){return elt.startsWith("id") ? elt.substring(9,13) : ""}) 
    .filter(function(elt){return elt != ""}) 
+0

спасибо, что нашли время ответить. я уверен, что буду использовать .map в будущем – bjjrolls

0

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

var dataString = "viewUsers_length=10&id%5B%5D=8163&id%5B%5D=8188&id%5B%5D=8141"; 
var myRegexp = /id%5B%5D=([0-9]+)/g; 
match = myRegexp.exec(dataString); 
while (match != null) { 
    console.log(match[1]); 
    match = myRegexp.exec(ddd); 
} 

выходы

8163 
8188 
8141 
+1

спасибо за ваш ответ. – bjjrolls

1

К сожалению, потому что имена параметров для идентификаторами являются все те же, обычные методы разбора строки запроса не может быть жизнеспособным. Таким образом, это может быть работа для регулярных выражений!

var dataString = "viewUsers_length=10&id%5B%5D=8163&id%5B%5D=8188&id%5B%5D=8141"; 
 

 
var regex = /&id%5B%5D=(\d+)/g; 
 
var match; 
 
var matches = []; 
 
while (match = regex.exec(dataString)) { 
 
    matches.push(match[1]); 
 
    } 
 

 
console.log(matches) 
 
var list = matches.join(', '); 
 

 
document.getElementById('output').innerHTML = list;
<div id="output"></div>

+0

спасибо за ваш ответ rodrigo. – bjjrolls

Смежные вопросы