Сортировать массив по пользовательской функции в JavaScript - PullRequest
2 голосов
/ 04 июня 2019

Я использую только Javascript.

У меня есть следующая строка:

?pn1=age&pn2=name&pv1=12&pv2=alice

Что мне нужно сделать, так это получить следующий результат:

age:12|name:alice

Я подумал, как это сделать, это следующее:

var str = "?pn1=age&pn2=name&pv1=12&pv2=alice";
var strSplit = str.split("&");
for (var i = 0; i < strSplit.length; i++) { 
   console.log(strSplit[i]);
}

Возвращает следующий результат:

?pn1=age
pn2=name
pv1=12
pv2=alice

Поскольку я хочу объединиться pn1 и pv1 и pn2 и pv2 , число присутствует в конце строки важно.

? Р 1 = возраст
р 2 = имя
ру * +1035 * 1 * 1 036 * = 12
PV 2 = Алиса

Так что я подумал, что способ сделать это - отсортировать массив по этому номеру. а затем объединить каждые 2 значения вместе после сортировки.

Я попробовал следующий код:

 strSplit.sort(function() {
    var pref = strSplit[i].split('=')[0];
    return pref.charAt(pref.length-1);
});

Кажется, не работает

Любая помощь будет оценена

Ответы [ 5 ]

2 голосов
/ 04 июня 2019
  • Вы можете использовать URLSearchParams для преобразования строки запроса в набор пар ключ-значение.
  • Затем выполните цикл по ним, чтобы сгруппировать значения pv и pn по номеру.
  • Разделите строковые и числовые значения с помощью регулярного выражения: (\D+)(\d+)
  • Переберите obj.pn и получите соответствующее значение pv для того же числа
  • Соединить полученный массив с |

Работает со значениями pn и pv в любом случайном порядке

const searchParams = new URLSearchParams("?pn1=age&pn2=name&pv1=12&pv2=alice")

const obj = { pn: {}, pv: {} }

for (let [key, value] of searchParams) {
  const [, k, number] = key.match(/(\D+)(\d+)/)
  obj[k][number] = value
}

const output = Object.entries(obj.pn)
                    .map(([n, key]) => `${key}:${obj.pv[n]}`)
                    .join("|")

console.log(output)
2 голосов
/ 04 июня 2019

Вы можете разделить части, собрать все элементы и вернуть объединенную строку.

var string = '?pn1=age&pn2=name&pv1=12&pv2=alice',
    result = string
        .slice(1)
        .split('&')
        .reduce((r, p) => {
            var [k, value] = p.split('='),
                [key, index] = k.split(/(\d+)/);
            index--;
            r[index] = r[index] || {};
            r[index][key] = value;
            return r;
        }, [])
        .map(({ pn, pv }) => [pn, pv].join(':'))
        .join('|');

console.log(result);
2 голосов
/ 04 июня 2019

Вы можете сделать это в следующих шагах.

  • Вы можете перебрать половину массива и добавить соответствующие ключи и значения в массив.
  • Рассмотрим iтекущий индекс, когда мы перебираем половину массива.
  • Элемент в позиции i будет ключевым.
  • Добавьте половину длины и добавьте ее к i, чтобы получить соответствующее значение.
  • split()и ключ и значение на = и получите второй элемент.

var str = "?pn1=age&pn2=name&pv1=12&pv2=alice";
var arr = str.split("&");
let half = arr.length/2
let res = [];
for (var i = 0; i < half; i++) { 
   res.push(`${arr[i].split('=')[1]}:${arr[i + half].split('=')[1]}`);
}
console.log(res.join('|'))
0 голосов
/ 04 июня 2019

Вы можете преобразовать это & разбиение в строку и удалить ?xxx=, а затем снова разделить его на ,, чтобы, наконец, получить массив с данными, которые вы просматриваете.

var str = "?pn1=age&pn2=name&pv1=12&pv2=alice";
var split = str.split('&').toString().replace(/([?]?[pnv0-9]+[=])/g,'').split(',');

console.log(split[0] + ':' + split[2] + '|' + split[1] + ':' + split[3]);

РЕДАКТИРОВАТЬ: стоит упомянуть для тех, кто ищет лучшее решение, я проверил все представленные здесь, нажмите здесь для получения дополнительной информации.

Список решений от самого быстрого до самого медленного:

  • Махер Али (113 610 операций / с ± 1,48%, самый быстрый)
  • tcj (112324 операций / с ± 1,01% медленнее на 1,13%)
  • Нина Шольц (81 067 операций / с ± 1,81%, на 28,64% медленнее)
  • Код Маньяка (80,074 операций / с ± 0,99%, замедление на 29,52%)
  • адига (33,065 операций / с ± 0,92%, медленнее на 70,9%)
0 голосов
/ 04 июня 2019

Одна идея состоит в том, чтобы сначала разделить значения на & и добавить их, чтобы взять цифру в качестве ключа и поместить на объект, а затем затем поместить соответствующие значения в желаемый формат

var str = "?pn1=age&pn2=name&pv1=12&pv2=alice".replace(/^\?/,'')

var strSplit = str.split("&");

let op = strSplit.reduce((op,inp) => {
  let [key,value] = inp.split('=')
  let digit = key.match(/\d+/)[0]
  op[digit] = op[digit] || []
  op[digit].push(value)
  return op
},{})

let final = Object.values(op).reduce((op,inp) => {
  let [key,value] = inp
  op.push(`${key}:${value}`)
  return op
} ,[]).join(' | ')

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