在 JavaScript 中对数组进行排序
Sorting arrays in JavaScript
我从后端收到一大堆对象,我使用过滤只留下这些值
const markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US'] // so now this is what have
然后我将通过市场绘制地图,但它将始终从 IT 开始并遵循该顺序。有没有办法按照特定顺序对其进行排序?
['US', 'DE', 'UK', 'FR', 'IT', 'NL']
即使我没有收到所有值,我也想按照此特定顺序对收到的每个数组进行排序。
恐怕没有这种方法,应该是升序或降序。或者如果数据不是那么多,您可以手动排序。
您需要编写自己的自定义比较函数
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
像这样:
markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US']
markets.sort((item1, item2) => {
neededOrder = ['US', 'DE', 'UK', 'FR', 'IT', 'NL']
idx1 = neededOrder.indexOf(item1)
idx2 = neededOrder.indexOf(item2)
if(idx1 < idx2) {
return -1
}
else if(idx1 > idx2) {
return 1
} else {
return 0
}
})
您可以在对象内为每个市场分配一个值,并使用该值与您从后端收到的市场数组进行比较和排序:
const markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US']
let mappedMarkets = {
'US': 1,
'DE': 2,
'UK': 3,
'FR': 4,
'IT': 5,
'NL': 6
}
console.log(markets.sort((a, b) => mappedMarkets[a] - mappedMarkets[b]))
可以实现一个函数,该函数使用一个对象作为每个市场优先值的查找对象,并将未知的市场项目放在最后。
function getAssuredMarketPrecedence(marketList) {
const marketPrecedence = {
US: 0, DE: 1, UK: 2, FR: 3, IT: 4, NL: 5,
};
return Array
.from(marketList)
.sort((a, b) =>
(marketPrecedence[a] ?? 1000) - (marketPrecedence[b] ?? 1000)
);
}
const markets = ['IT', 'DE', 'unknown2', 'UK', 'FR', 'unknown1', 'NL', 'US']
const sorted = getAssuredMarketPrecedence(markets);
console.log({ markets, sorted });
.as-console-wrapper { min-height: 100%!important; top: 0; }
您可以:
- 将列表一分为二sub-arrays
- 订单列表中您可以按所需排序的那些
order
- 不在你不必排序的列表中的那些
- 合并 sub-arrays 使用:
[...s1, ...s2]
const markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US','KE','UG','TZ'], // so now this is what have
order = ['US', 'DE', 'UK', 'FR', 'IT', 'NL'],
output = [
...markets.filter(c => order.includes(c)).sort(
(a, b) =>
order.findIndex(x => x === a) - order.findIndex(x => x === b)
),
...markets.filter(c => !order.includes(c))
];
console.log( output );
或者,...
如果每个 markets
仅包含 order
中的项目,您可以省略第二个 sub-array 并改用以下内容:
const markets = ['IT', 'DE', 'UK', 'NL', 'US'],
order = ['US', 'DE', 'UK', 'FR', 'IT', 'NL'],
output = markets.filter(c => order.includes(c)).sort(
(a, b) =>
order.findIndex(x => x === a) - order.findIndex(x => x === b)
);
console.log( output );
我从后端收到一大堆对象,我使用过滤只留下这些值
const markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US'] // so now this is what have
然后我将通过市场绘制地图,但它将始终从 IT 开始并遵循该顺序。有没有办法按照特定顺序对其进行排序?
['US', 'DE', 'UK', 'FR', 'IT', 'NL']
即使我没有收到所有值,我也想按照此特定顺序对收到的每个数组进行排序。
恐怕没有这种方法,应该是升序或降序。或者如果数据不是那么多,您可以手动排序。
您需要编写自己的自定义比较函数
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
像这样:
markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US']
markets.sort((item1, item2) => {
neededOrder = ['US', 'DE', 'UK', 'FR', 'IT', 'NL']
idx1 = neededOrder.indexOf(item1)
idx2 = neededOrder.indexOf(item2)
if(idx1 < idx2) {
return -1
}
else if(idx1 > idx2) {
return 1
} else {
return 0
}
})
您可以在对象内为每个市场分配一个值,并使用该值与您从后端收到的市场数组进行比较和排序:
const markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US']
let mappedMarkets = {
'US': 1,
'DE': 2,
'UK': 3,
'FR': 4,
'IT': 5,
'NL': 6
}
console.log(markets.sort((a, b) => mappedMarkets[a] - mappedMarkets[b]))
可以实现一个函数,该函数使用一个对象作为每个市场优先值的查找对象,并将未知的市场项目放在最后。
function getAssuredMarketPrecedence(marketList) {
const marketPrecedence = {
US: 0, DE: 1, UK: 2, FR: 3, IT: 4, NL: 5,
};
return Array
.from(marketList)
.sort((a, b) =>
(marketPrecedence[a] ?? 1000) - (marketPrecedence[b] ?? 1000)
);
}
const markets = ['IT', 'DE', 'unknown2', 'UK', 'FR', 'unknown1', 'NL', 'US']
const sorted = getAssuredMarketPrecedence(markets);
console.log({ markets, sorted });
.as-console-wrapper { min-height: 100%!important; top: 0; }
您可以:
- 将列表一分为二sub-arrays
- 订单列表中您可以按所需排序的那些
order
- 不在你不必排序的列表中的那些
- 合并 sub-arrays 使用:
[...s1, ...s2]
const markets = ['IT', 'DE', 'UK', 'FR', 'NL', 'US','KE','UG','TZ'], // so now this is what have
order = ['US', 'DE', 'UK', 'FR', 'IT', 'NL'],
output = [
...markets.filter(c => order.includes(c)).sort(
(a, b) =>
order.findIndex(x => x === a) - order.findIndex(x => x === b)
),
...markets.filter(c => !order.includes(c))
];
console.log( output );
或者,...
如果每个 markets
仅包含 order
中的项目,您可以省略第二个 sub-array 并改用以下内容:
const markets = ['IT', 'DE', 'UK', 'NL', 'US'],
order = ['US', 'DE', 'UK', 'FR', 'IT', 'NL'],
output = markets.filter(c => order.includes(c)).sort(
(a, b) =>
order.findIndex(x => x === a) - order.findIndex(x => x === b)
);
console.log( output );