我试图根据属性值对对象数组进行排序,但该属性是一个包含数字的字符串。例如,我有一个像这样的对象数组:
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;
});
尝试以上逻辑,它应该工作
您可以使用parseInt
或parseFloat
将value
转换为数字,然后执行排序算法:
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);