繁体   English   中英

以数字顺序用逗号分隔的价格字符串对对象数组进行排序

[英]Sorting array of objects with comma-delimited price strings in numeric order

我正在使用此解决方案对对象数组进行排序。 这是功能:

function sortJsonArrayByProperty(objArray, prop, direction){
    if (arguments.length<2) throw new Error("sortJsonArrayByProp requires 2 arguments");
    var direct = arguments.length>2 ? arguments[2] : 1; //Default to ascending
    if (objArray && objArray.constructor===Array){
        var propPath = (prop.constructor===Array) ? prop : prop.split(".");
        objArray.sort(function(a,b){
            for (var p in propPath){
                if (a[propPath[p]] && b[propPath[p]]){
                    a = a[propPath[p]];
                    b = b[propPath[p]];
                }
            }
            // convert numeric strings to integers
            a = a.match(/^\d+$/) ? +a : a;
            b = b.match(/^\d+$/) ? +b : b;
            return ( (a < b) ? -1*direct : ((a > b) ? 1*direct : 0) );
        });
    }
}

这是一个很好的解决方案。

但是我对以这种格式存储价格的列有问题:

950,75
1234,99
500,00

因此,我用逗号分隔小数点的值。 然后,代替此顺序:

222,55
550,00
2000,99
3000,00

我越来越:

2000,99
222,55
3000,00
550,00

我正在尝试在此部分进行一些修改:

a = a.match(/^\d+$/) ? +a : a; 
b = b.match(/^\d+$/) ? +b : b;

但这不起作用。 怎么了?

JavaScript不会将逗号识别为有效的垃圾数字,因此您不能使用一元+或任何其他内置方法将其转换为数字。 您需要将逗号替换为句号,然后将其强制为Number。

a = a.match(/^(\d+),(\d+)$/) ? +(a[1]+'.'+a[2]) : a; 

在JavaScript中,小数点分隔符始终为. ,从不,因为在某些语言环境中。 因此,要使用数字字符串转换,为十进制为JavaScript数字,你这样做:

theNumber = +theString.replace(/\./g, '').replace(/,/g, '.');

要么

theNumber = parseFloat(theString.replace(/\./g, '').replace(/,/g, '.'));

...取决于您是否要忽略结尾的无效字符( +不是, parseFloat是)。

因此,这表明:

aVal = +a.replace(/\./g, '').replace(/,/g, '.');
bVal = +b.replace(/\./g, '').replace(/,/g, '.');
if (!isNaN(aVal) && !isNaN(bVal)) {
    a = aVal;
    b = bVal;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM