使用JavaScript中的自定义函数对数组进行排序

时间:2019-06-04 10:46:44

标签: javascript arrays sorting

我只使用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 ,因此字符串的结尾很重要。

?pn 1 =年龄
pn 2 =名称
pv 1 = 12
pv 2 = alice

因此,我认为一种实现方法是按此数字对数组进行排序。然后在排序后将每2个值连接在一起。

我尝试了以下代码:

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

它似乎不起作用

任何帮助将不胜感激

5 个答案:

答案 0 :(得分:2)

您可以按照以下步骤进行操作。

  • 您可以遍历整个数组的一半,并将相应的键和值添加到数组。
  • 考虑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('|'))

答案 1 :(得分:2)

您可以拆分各部分,收集所有项目并返回一个连接的字符串。

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 :(得分:2)

  • 您可以使用URLSearchParams将查询字符串转换为键值对的集合。
  • 然后遍历它们以根据数字将pvpn值分组。
  • 使用正则表达式分隔字符串和数字值:(\D+)(\d+)
  • 遍历obj.pn并获得相同数字的相应pv
  • 使用|
  • 加入结果数组

这适用于任意随机顺序的pnpv

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)

答案 3 :(得分:0)

一个想法是先在&上分割值,然后将其添加为数字作为键并放置在对象上,然后再将各个值以所需的格式放置

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)

答案 4 :(得分:0)

您可以将&拆分为字符串,然后删除?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]);

编辑::对于那些寻求最佳性能解决方案的人来说值得一提,我已经测试了此处提供的所有解决方案,请点击here以获取更多信息。

从最快到最慢的解决方案列表:

  • Maheer Ali (最快113,610 ops / s±1.48%)
  • tcj (慢112,324 ops / s±1.01%1.13%)
  • Nina Scholz (慢81,067 ops / s±1.81%28.64%)
  • 代码疯子(速度为80,074 ops / s±0.99%,慢29.52%)
  • adiga (慢33,065 ops / s±0.92%70.9%)