簡體   English   中英

在JavaScript中按自定義函數對數組進行排序

[英]Sort array by custom function in JavaScript

我只使用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

由於我想將pn1pv1以及pn2pv2連接在一起,因此字符串末尾的數字很重要。

?pn 1 =年齡
pn 2 =名稱
pv 1 = 12
pv 2 =愛麗絲

因此,我認為一種方法是按此數字對數組進行排序。 然后在排序后將每2個值連接在一起。

我嘗試了以下代碼:

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

它似乎不起作用

任何幫助,將不勝感激

您可以按照以下步驟進行操作。

  • 您可以遍歷數組的一半並將相應的鍵和值添加到數組。
  • 當我們遍歷半數組時,請考慮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('|')) 

您可以拆分各部分,收集所有項目並返回一個連接的字符串。

 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); 

  • 您可以使用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) 

一個想法是先在&上分割值,然后將其添加為數字作為鍵並放在對象上,然后再將各自的值以所需格式放置

 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) 

您可以將&轉換為字符串,然后刪除?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]); 

編輯:對於那些尋求最佳性能解決方案的人,值得一提,我已經測試了此處提供的所有解決方案,請單擊此處獲取更多信息。

該解決方案的列表從最快到最慢:

  • 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%)
  • Code Maniac (80,074 ops / s降低±0.99%29.52%)
  • adiga (33,065 ops / s±0.92%慢70.9%)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM