Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环对象数组,并根据键值对的匹配集进行筛选/排序/分组。_Javascript_Arrays_Reactjs_Sorting_Ecmascript 6 - Fatal编程技术网

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