首页 > 解决方案 > 如何在对象数组的 shift() 之后使用 include()

问题描述

1 - 我有一个间隔循环通过一组玩家。

2 - 数组是一个对象数组。对象示例

 {
                        id      : "100",
                        fname   : "tom",
                        lname   : "smith",
                        position: 15,
                        team    : "Giants"
                    };

3 - 数组有很多玩家,例如 player_list =[ {"id":"2218","avg":"60.9189","min":"1","max":"380","fname":"Patrick","lname":"Mahomes","position":"QB","team":"Chiefs"},{"id":"65","avg":"48.6216","min":"1","max":"194","fname":"Josh","lname":"Allen","position":"QB","team":"Bills"},{"id":"416","avg":"58.3784","min":"1","max":"213","fname":"Drew","lname":"Brees","position":"QB","team":"Saints"},{"id":"591","avg":"69.0270","min":"1","max":"231","fname":"Derek","lname":"Carr","position":"QB","team":"Raiders"},{"id":"840","avg":"61.1081","min":"1","max":"252","fname":"Sam","lname":"Darnold","position":"QB","team":"Jets"}]

4 - 在每个循环中,我首先使用 player_list.shift();

5 - 然后我将每个选定的玩家存储在另一个具有相同结构的对象数组中,称为 selected_players_list。这将包括从轮班中选择的每个玩家。

6 - 问题是以上只是玩家可以选择的方式之一,另一种方式是由用户手动选择,这也将被添加到 selected_players_list 中。

7 - 我想通过从players_list中删除玩家来自动删除任何手动选择的玩家

8 - 我有这个代码。

// loop through the players array
     players_list.forEach(function(element) {
// check if the object exists in the other array 
                            if(selected_players_list.includes(element)){
                                console.log('FOUND');
                                debugger;
// get the index of that object found
    let found = total_result_player_data.findIndex(obj => obj.id === element.id);
                                if(found !== -1){
                                    console.log('SPLICED -> ' + found);
// remove it from players list array
                                    players_list.splice(found, 1);
                                    console.log(players_list);
                                //    debugger;
                                }
                            }
                        });

9 - 之后我想从数组中转移第一个玩家。

object_random_pick = players_list.shift();

10 - 但在第二个循环中,include 不再在 selected_players_list 数组中找到该玩家。

11 - 如果我改用它,它可以正常工作。

object_random_pick = players_list[0];

12 - 但是它反复使用相同的选择,这不是我想要的。我不希望任何玩家使用超过一次。

标签: javascript

解决方案


不要使用.splice.shift在循环内。在循环完成这项工作之前更改数组。如果你想从数组中删除一些元素,你必须使用.filter

此代码只是示例如何使用.filter

players_list = [ {"id":"2218","avg":"60.9189","min":"1","max":"380","fname":"Patrick","lname":"Mahomes","position":"QB","team":"Chiefs"},{"id":"65","avg":"48.6216","min":"1","max":"194","fname":"Josh","lname":"Allen","position":"QB","team":"Bills"},{"id":"416","avg":"58.3784","min":"1","max":"213","fname":"Drew","lname":"Brees","position":"QB","team":"Saints"},{"id":"591","avg":"69.0270","min":"1","max":"231","fname":"Derek","lname":"Carr","position":"QB","team":"Raiders"},{"id":"840","avg":"61.1081","min":"1","max":"252","fname":"Sam","lname":"Darnold","position":"QB","team":"Jets"}]

// loop through the players array
const chekedPlayers = players_list.filter(function(element) {
    // check if the object exists in the other array 
    if (selected_players_list.includes(element)) {
        console.log('FOUND');
        //debugger;
        // get the index of that object found
        let found = total_result_player_data.findIndex(obj => obj.id === element.id);
        if (found !== -1) {
            console.log('SPLICED -> ' + found);
            // remove it from players list array
            return false; //
            console.log(players_list);
            //    debugger;
        }

        return true;
    }
});```

You can read doc of `.filter` and use how you need.

推荐阅读