Javascript 循环对象数组,并根据键值对的匹配集进行筛选/排序/分组。
我有一些数据如下:Javascript 循环对象数组,并根据键值对的匹配集进行筛选/排序/分组。,javascript,arrays,reactjs,sorting,ecmascript-6,Javascript,Arrays,Reactjs,Sorting,Ecmascript 6,我有一些数据如下: "players": [ { "name": "Molla Wague", "position": "Centre-Back", "jerseyNumber": 13, "dateOfBirth": "1991-02-21", "nationality": "Mali", "contractUntil": "2018-06-30", "marketValue": null }, { "na
"players": [
{
"name": "Molla Wague",
"position": "Centre-Back",
"jerseyNumber": 13,
"dateOfBirth": "1991-02-21",
"nationality": "Mali",
"contractUntil": "2018-06-30",
"marketValue": null
},
{
"name": "Heurelho Gomes",
"position": "Keeper",
"jerseyNumber": 1,
"dateOfBirth": "1981-02-15",
"nationality": "Brazil",
"contractUntil": "2019-06-30",
"marketValue": null
},
{
"name": "Christian Kabasele",
"position": "Centre-Back",
"jerseyNumber": 27,
"dateOfBirth": "1991-02-24",
"nationality": "Belgium",
"contractUntil": "2021-06-30",
"marketValue": null
},
{
"name": "José Holebas",
"position": "Left-Back",
"jerseyNumber": 25,
"dateOfBirth": "1984-06-27",
"nationality": "Greece",
"contractUntil": "2020-06-30",
"marketValue": null
},
{
"name": "Daryl Janmaat",
"position": "Right-Back",
"jerseyNumber": 2,
"dateOfBirth": "1989-07-22",
"nationality": "Netherlands",
"contractUntil": "2020-06-30",
"marketValue": null
},
{
"name": "Étienne Capoue",
"position": "Defensive Midfield",
"jerseyNumber": 29,
"dateOfBirth": "1988-07-11",
"nationality": "France",
"contractUntil": "2019-06-30",
"marketValue": null
},
{
"name": "Tom Cleverley",
"position": "Central Midfield",
"jerseyNumber": 8,
"dateOfBirth": "1989-08-12",
"nationality": "England",
"contractUntil": "2022-06-30",
"marketValue": null
},
{
"name": "Roberto Pereyra",
"position": "Attacking Midfield",
"jerseyNumber": 37,
"dateOfBirth": "1991-01-07",
"nationality": "Argentina",
"contractUntil": "2021-06-30",
"marketValue": null
},
{
"name": "Troy Deeney",
"position": "Centre-Forward",
"jerseyNumber": 9,
"dateOfBirth": "1988-06-29",
"nationality": "England",
"contractUntil": "2021-06-30",
"marketValue": null
}
]
有些玩家有不同的位置
我想根据每个球员的位置来排序,所以所有的守门员排在第一位,然后是所有的中后卫,依此类推
我正在使用React和Redux。我已经在我的Reducer文件中完成了一些工作,但我认为代码过于臃肿,下面是一个示例:
function sortPlayersByPosition(data) {
let players = data.players;
let result = [];
result.push(players.filter(function(obj) {
return obj.position === 'Keeper';
}));
result.push(players.filter(function(obj) {
return obj.position === 'Centre-Back';
}));
result.push(players.filter(function(obj) {
return obj.position === 'Right-Back';
}));
result.push(players.filter(function(obj) {
return obj.position === 'Left-Back';
}));
result.push(players.filter(function(obj) {
return obj.position === 'Defensive Midfield';
}));
result.push(players.filter(function(obj) {
return obj.position === 'Central Midfield';
}));
result.push(players.filter(function(obj) {
return obj.position === 'Attacking Midfield';
}));
result.push(players.filter(function(obj) {
return obj.position === 'Right Wing';
}));
result.push(players.filter(function(obj) {
return obj.position === 'Left Wing';
}));
result.push(players.filter(function(obj) {
return obj.position === 'Centre-Forward';
}));
data.players = result;
return data
}
export const fetchTeamPlayersReducer = (state = [], action) => {
switch (action.type) {
case 'FETCH_TEAM_PLAYERS_SUCCESS':
var sortedPlayers = sortPlayersByPosition(action.payload);
return sortedPlayers;
default:
return state;
}
}
正如你们所看到的,我把我的位置分成了不同的数组。我不希望有这样的结果。如果我有一个有序的数组,我会非常喜欢它。就像原来的格式一样
欢迎任何帮助
谢谢 您可以尝试:
const positions = [
'Keeper', 'Centre-Back', 'Right-Back', 'Left-Back', 'Defensive Midfield',
'Central Midfield', 'Attacking Midfield', 'Right Wing', 'Left Wing', 'Centre-Forward',
];
data.players.sort((a, b) => positions.indexOf(a.position) > positions.indexOf(b.position));
输出:
[{
"name": "Heurelho Gomes",
"position": "Keeper",
"jerseyNumber": 1,
"dateOfBirth": "1981-02-15",
"nationality": "Brazil",
"contractUntil": "2019-06-30",
"marketValue": null,
}, {
"name": "Molla Wague",
"position": "Centre-Back",
"jerseyNumber": 13,
"dateOfBirth": "1991-02-21",
"nationality": "Mali",
"contractUntil": "2018-06-30",
"marketValue": null,
}, {
"name": "Christian Kabasele",
"position": "Centre-Back",
"jerseyNumber": 27,
"dateOfBirth": "1991-02-24",
"nationality": "Belgium",
"contractUntil": "2021-06-30",
"marketValue": null,
}, {
"name": "Daryl Janmaat",
"position": "Right-Back",
"jerseyNumber": 2,
"dateOfBirth": "1989-07-22",
"nationality": "Netherlands",
"contractUntil": "2020-06-30",
"marketValue": null,
}, {
"name": "José Holebas",
"position": "Left-Back",
"jerseyNumber": 25,
"dateOfBirth": "1984-06-27",
"nationality": "Greece",
"contractUntil": "2020-06-30",
"marketValue": null,
}, {
"name": "Étienne Capoue",
"position": "Defensive Midfield",
"jerseyNumber": 29,
"dateOfBirth": "1988-07-11",
"nationality": "France",
"contractUntil": "2019-06-30",
"marketValue": null,
}, {
"name": "Tom Cleverley",
"position": "Central Midfield",
"jerseyNumber": 8,
"dateOfBirth": "1989-08-12",
"nationality": "England",
"contractUntil": "2022-06-30",
"marketValue": null,
}, {
"name": "Roberto Pereyra",
"position": "Attacking Midfield",
"jerseyNumber": 37,
"dateOfBirth": "1991-01-07",
"nationality": "Argentina",
"contractUntil": "2021-06-30",
"marketValue": null,
}, {
"name": "Troy Deeney",
"position": "Centre-Forward",
"jerseyNumber": 9,
"dateOfBirth": "1988-06-29",
"nationality": "England",
"contractUntil": "2021-06-30",
"marketValue": null,
}]
您可以首先创建有序位置的数组:
const ORDERS = [
'Keeper',
'Centre-Back',
...
]
并根据此ORDERS数组对初始数组进行排序
players.sort((player1, player2) => {
return ORDERS.indexOf(player2.position) - ORDERS.indexOf(player1.position);
});
您可以定义包含排序优先级的对象,并定义自定义排序函数,如下所示:
玩家=[
{
“姓名”:“莫拉·瓦格”,
“位置”:“中后卫”,
“运动衫编号”:13,
“出生日期”:“1991-02-21”,
“国籍”:“马里”,
“合同期限”:“2018-06-30”,
“市场价值”:空
},
{
“姓名”:“Heurelho Gomes”,
“职位”:“守门员”,
“运动衫编号”:1,
“出生日期”:“1981-02-15”,
“国籍”:“巴西”,
“合同期限”:“2019-06-30”,
“市场价值”:空
},
{
“名称”:“克里斯蒂安·卡巴塞尔”,
“位置”:“中后卫”,
“运动衫编号”:27,
“出生日期”:“1991-02-24”,
“国籍”:“比利时”,
“合同期限至”:“2021-06-30”,
“市场价值”:空
},
{
“姓名”:“何塞·霍莱巴斯”,
“位置”:“左后卫”,
“运动衫编号”:25,
“出生日期”:“1984-06-27”,
“国籍”:“希腊”,
“合同期限”:“2020-06-30”,
“市场价值”:空
},
{
“姓名”:“Daryl Janmaat”,
“位置”:“右后卫”,
“运动衫编号”:2,
“出生日期”:“1989-07-22”,
“国籍”:“荷兰”,
“合同期限”:“2020-06-30”,
“市场价值”:空
},
{
“名称”:“Étienne Capoue”,
“位置”:“防守中场”,
“运动衫编号”:29,
“出生日期”:“1988-07-11”,
“国籍”:“法国”,
“合同期限”:“2019-06-30”,
“市场价值”:空
},
{
“姓名”:“Tom Cleverley”,
“位置”:“中央中场”,
“运动衫编号”:8,
“出生日期”:“1989-08-12”,
“国籍”:“英国”,
“合同终止日期”:“2022-06-30”,
“市场价值”:空
},
{
“姓名”:“罗伯托·佩雷拉”,
“位置”:“进攻型中场”,
“运动衫编号”:37,
“出生日期”:“1991-01-07”,
“国籍”:“阿根廷”,
“合同期限至”:“2021-06-30”,
“市场价值”:空
},
{
“姓名”:“特洛伊·迪尼”,
“位置”:“中锋”,
“运动衫编号”:9,
“出生日期”:“1988-06-29”,
“国籍”:“英国”,
“合同期限至”:“2021-06-30”,
“市场价值”:空
}
];
排序器={
“保管员”:0,
“中后卫”:1,
“中锋”:2,
“左后卫”:3,
“右后卫”:4,
“防守型中场”:5,
“中央中场”:6,
“进攻型中场”:7,
};
函数排序(player1、player2){
常量player1Value=排序器[player1.位置];
常量player2Value=sortOrder[player2.位置];
如果(player1Value>player2Value){return 1;}
else if(player1Value