根据属性值对对象数组进行排序,但该属性是一个包含数字的字符串



我试图根据属性值对对象数组进行排序,但该属性是一个包含数字的字符串。例如,我有一个像这样的对象数组:

const data = [
{ name: 'Item 1', value: '2 apples' },
{ name: 'Item 2', value: '10 oranges' },
{ name: 'Item 3', value: '1 banana' },
{ name: 'Item 4', value: '5 strawberries' }
];

我想根据value属性中的数值对数组进行排序,这样排序后的数组看起来像这样:

[  { name: 'Item 3', value: '1 banana' },  { name: 'Item 1', value: '2 apples' },  { name: 'Item 4', value: '5 strawberries' },  { name: 'Item 2', value: '10 oranges' }]

这是我的代码,它不工作

data=data.sort((a,b) => b.value-a.value)

一种解决方案可以是:在空间上分割值,然后从第0个索引中得到数字,然后比较";。有更好的分类方法吗?

data.sort((a, b) => {
const numA = parseInt(a.value);
const numB = parseInt(b.value);
return numA - numB;
});

尝试以上逻辑,它应该工作

您可以使用parseIntparseFloatvalue转换为数字,然后执行排序算法:

parseFloat('10 oranges'); // 10

注意:只有当数字总是出现在字符串的开头时,这才有效。

const data = [
{ name: 'Item 1', value: '2 apples' },
{ name: 'Item 2', value: '10 oranges' },
{ name: 'Item 3', value: '1 banana' },
{ name: 'Item 4', value: '5 strawberries' }
];
const output = data.sort((a, b) => parseFloat(a.value) - parseFloat(b.value));
console.log(output);

您可以使用replace和正则表达式提取要排序的数字:

const data = [
{ name: 'Item 1', value: '2 apples' },
{ name: 'Item 2', value: '10 oranges' },
{ name: 'Item 3', value: '1 banana' },
{ name: 'Item 4', value: '5 strawberries' }
];

const sorted = data.sort((a, b) => parseInt(a.value.replace(/D/g, "")) - parseInt(b.value.replace(/D/g,"")));
console.log(sorted);

extractNumber函数使用正则表达式(/d+/)提取字符串中的第一个数字,然后使用parseInt()将其作为整数返回。如果找不到数字,则返回0。然后在排序方法中使用该函数来比较数字。

const data = [
{ name: 'Item 1', value: '2 apples' },
{ name: 'Item 2', value: '10 oranges' },
{ name: 'Item 3', value: '1 banana' },
{ name: 'Item 4', value: '5 strawberries' }
];
const extractNumber = (str) => {
const num = str.match(/d+/);
return num ? parseInt(num[0]) : 0;
};
const sortedData = data.sort((a, b) => extractNumber(a.value) - extractNumber(b.value));
console.log(sortedData);

最新更新