如何在JavaScript中对带有逗号分隔数字和符号的字符串数组进行最佳排序

如何在JavaScript中对带有逗号分隔数字和符号的字符串数组进行最佳排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,在JavaScript中对包含逗号分隔数字和符号的字符串数组排序()的最佳方法是什么 我的数组如下所示: var uniqueValues = ["<100,000", ">100,000", ">250,000", ">500,000", ">1,000,000", ">750,000"] [">1,000,000", ">750,000", ">500,000", ">250,000", ">100,000", "<1

在JavaScript中对包含逗号分隔数字和符号的字符串数组排序()的最佳方法是什么

我的数组如下所示:

var uniqueValues = ["<100,000", ">100,000", ">250,000", ">500,000", ">1,000,000", ">750,000"]
[">1,000,000", ">750,000", ">500,000", ">250,000", ">100,000", "<100,000"]
var uniqueValues=[“100000”、“>250000”、“>500000”、“>1000000”、“>750000”]
我需要它看起来像这样:

var uniqueValues = ["<100,000", ">100,000", ">250,000", ">500,000", ">1,000,000", ">750,000"]
[">1,000,000", ">750,000", ">500,000", ">250,000", ">100,000", "<100,000"]

[“>1000000”、“>750000”、“>500000”、“>250000”、“>100000”、“>100000”、”高于”使用创建字符串到数值的映射,然后使用映射中的数值进行排序:

var uniqueValues=[“100000”、“>250000”、“>500000”、“>1000000”、“>750000”];
var valuesMap=唯一值.reduce(函数(映射,v){
//通过删除所有非数字字符、解析并将符号转换为数字来转换为数字
映射[v]={
值:+v.replace(/[^\d]/g',),
符号:v[0]=='>'?1:-1
};
返回图;
},Object.create(null));
//使用地图中相应的值进行排序-如果值相等,则比较符号
uniqueValues.sort(函数(a,b){
var am=价值映射[a];
var bm=价值map[b];
返回bm.value-am.value | | bm.sign-am.sign;
});

console.log(uniqueValues);
使用创建字符串到数值的映射,然后使用映射中的数值进行排序:

var uniqueValues=[“100000”、“>250000”、“>500000”、“>1000000”、“>750000”];
var valuesMap=唯一值.reduce(函数(映射,v){
//通过删除所有非数字字符、解析并将符号转换为数字来转换为数字
映射[v]={
值:+v.replace(/[^\d]/g',),
符号:v[0]=='>'?1:-1
};
返回图;
},Object.create(null));
//使用地图中相应的值进行排序-如果值相等,则比较符号
uniqueValues.sort(函数(a,b){
var am=价值映射[a];
var bm=价值map[b];
返回bm.value-am.value | | bm.sign-am.sign;
});

console.log(uniqueValues);
如果数字中包含
,则在数字中添加1,然后排序:

var uniqueValues=[“100000”、“>250000”、“>500000”、“>1000000”、“>750000”]
变量s2i=(s)=>{
设n=parseInt(s.replace(/[^\d]/g,'))
返回n+(s.includes('>')?1:0)
};
uniqueValues.sort((a,b)=>数学符号(s2i(a)-s2i(b));

console.log(uniqueValues)
如果数字中包含
,则在数字中添加1,然后排序:

var uniqueValues=[“100000”、“>250000”、“>500000”、“>1000000”、“>750000”]
变量s2i=(s)=>{
设n=parseInt(s.replace(/[^\d]/g,'))
返回n+(s.includes('>')?1:0)
};
uniqueValues.sort((a,b)=>数学符号(s2i(a)-s2i(b));

log(uniqueValues)
一种稍有不同的方法是使用解析方法,因为您并不完全希望根据字符串值进行排序,而是希望根据它们表示的数量级进行排序


假设每个表达式都应该解释为一个较大的数字(“>”)或较小的数字(“”),一种稍有不同的方法是使用解析方法,因为您并不完全希望根据字符串值进行排序,而是希望根据它们表示的数量级进行排序


假设每个表达式都应解释为一个较大的数字(“>”)或较小的数字(“不是最优雅或可靠的解决方案,但非常简单:

uniqueValues.sort((a, b) => {
  const aStr = a.substring(1)
  const bStr = b.substring(1)
  if (aStr == bStr) {
    return a < b ? 1 : -1
  }
  const aInt = parseInt(bStr.split(',').join(''))
  const bInt = parseInt(aStr.split(',').join(''))
  return aInt - bInt
})
uniqueValues.sort((a,b)=>{
常量aStr=a.子字符串(1)
常量bStr=b.子字符串(1)
如果(aStr==bStr){
返回a
不是最优雅、最稳健的解决方案,但非常简单:

uniqueValues.sort((a, b) => {
  const aStr = a.substring(1)
  const bStr = b.substring(1)
  if (aStr == bStr) {
    return a < b ? 1 : -1
  }
  const aInt = parseInt(bStr.split(',').join(''))
  const bInt = parseInt(aStr.split(',').join(''))
  return aInt - bInt
})
uniqueValues.sort((a,b)=>{
常量aStr=a.子字符串(1)
常量bStr=b.子字符串(1)
如果(aStr==bStr){
返回a
将字符串转换为数字,并使用ε估计值而不是
进行比较

代码如下:

var a = ["<100,000", ">100,000", ">250,000", ">500,000", ">1,000,000", ">750,000"];
var epsilon = 0.000001; // Choose whatever precision you require.

function toNumber(x) {
  var signedEpsilon = (x[0] === "<" ? -epsilon : epsilon); // signed epsilon.
  return parseFloat(x.slice(1).replace(/,/g, "")) + signedEpsilon;
}

a.sort((x, y) => toNumber(x) < toNumber(y));
var a=[“100000”、“>250000”、“>500000”、“>1000000”、“>750000”];
var epsilon=0.000001;//选择所需的精度。
函数编号(x){

var signedEpsilon=(x[0]==”将字符串转换为数字,并使用epsilon估计而不是
进行比较

代码如下:

var a = ["<100,000", ">100,000", ">250,000", ">500,000", ">1,000,000", ">750,000"];
var epsilon = 0.000001; // Choose whatever precision you require.

function toNumber(x) {
  var signedEpsilon = (x[0] === "<" ? -epsilon : epsilon); // signed epsilon.
  return parseFloat(x.slice(1).replace(/,/g, "")) + signedEpsilon;
}

a.sort((x, y) => toNumber(x) < toNumber(y));
var a=[“100000”、“>250000”、“>500000”、“>1000000”、“>750000”];
var epsilon=0.000001;//选择所需的精度。
函数编号(x){


变量signedEpsilon=(x[0]=="不是最好的解决方案..但是你可以用'+'替换''。然后排序并替换回去。这不是最好的解决方案..但是你可以用'+'替换''。然后排序并替换回去。你可能想要符号
*
,而不是
+
。谢谢@Ori Drori,我感谢你花时间解决这个问题。我特别感激你e你可以用ES5和ES6两种语言来写。无论答案多么漂亮,都有点难理解,所以我不选择它作为答案。@codelinquint-完全可以理解。尽管如此,这是一个令人愉快的问题。你可能希望符号是
*
,而不是
+
。谢谢你@Ori Drori,我感谢你接受这个问题是时候解决这个问题了。我特别感谢你用ES5和ES6两种语言写它。无论答案多么漂亮,都有点难以理解,所以我不选择它作为答案。@codelinquint-完全可以理解。尽管如此,这是一个令人愉快的问题。非常优雅,解释得很好。谢谢你@Frederik。我很好非常感谢。您可能希望排序函数中出现
-
,而不是
@codelinquint。请不要忘记标记正确的答案(在本例中,您最喜欢的答案,因为大多数答案都是正确的)。@georg更新了。谢谢!而且,这似乎不会再次出现