如果在 localeCompare 函数中设置 numeric:true 会有任何变化吗

Vas*_*ram 1 html javascript function

我有带有数字和字符串类型的表值,并且想知道设置数字 true 会带来对列中字符串值进行排序的任何更改

VLA*_*LAZ 5

是的,将数据视为数字确实可以改变顺序。考虑一下:

const column = [ "1", "3", "10", "24", "212" ];

column.sort((a, b) => a.localeCompare(b));
console.log("lexicographical sort:", column);

column.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log("sort with numeric collation:", column);
Run Code Online (Sandbox Code Playgroud)

字典顺序排序"10"位于前面"2",因为"1" < "2"而不是检查整个数字。如果您也有相同的名称,这也可以工作:

const column = [ "file_1", "file_3", "file_10", "file_24", "file_212" ];

column.sort((a, b) => a.localeCompare(b));
console.log("lexicographical sort:", column);

column.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log("sort with numeric collation:", column);
Run Code Online (Sandbox Code Playgroud)

但在某些情况下,如果您不想将数字视为一个整体单位,则可能是不可取的:

const column = [ "1 Somewhere Street", "3 Some Avenue", "10 Some Avenue", "24 Parking", "212 Whatever Road" ];

column.sort((a, b) => a.localeCompare(b));
console.log("lexicographical sort:", column);

column.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log("sort with numeric collation:", column);

column.sort((a, b) => {
  const regex = /^(\d+)\s+(.*)/;
  const [, numericA, stringA] = a.match(regex);
  const [, numericB, stringB] = b.match(regex);
  
  return stringA.localeCompare(stringB) 
    || numericA.localeCompare(numericB, undefined, { numeric: true })
});
console.log("sort with starting numerics treated last:", column);
Run Code Online (Sandbox Code Playgroud)

因此,这取决于您的数据是什么样子以及您希望如何呈现。