【问题标题】:duplicate player name should not be in the same array重复的玩家名称不应该在同一个数组中
【发布时间】:2021-07-05 09:52:55
【问题描述】:

我正在制作一个匹配系统,将匹配 2 个相同级别的玩家。

我的目标是如何在同一个文件中删除重复的玩家名称 大批?删除该重复条目后,应将其存储在 另一个数组(等待列表)。

我在下面提供了一个示例和屏幕截图。任何帮助将不胜感激。谢谢。

匹配脚本:(匹配同级玩家)

const combine = (source) => {
  return source.reduce((acc, curr) => {
    if (acc[curr.level]) {
      const levelArr = acc[curr.level];
      const last = levelArr[levelArr.length - 1];
      if (last.length === 2) {
        levelArr.push([curr])
      } else {
        last.push(curr)
      }
    } else {
      acc[curr.level] = [
        [curr]
      ];
    }
    return acc;
  }, {})
};

脚本 ajax:(从数据库中获取数据)

let ajaxResult = []; // the pushed data will be saved here
let save_method;
let table;
let base_url = "<?php echo base_url();?>";

let result = [];
var html = "";

$(document).ready(function() {
    //datatables
    table = $("#entry_list1").DataTable({


        processing: false,
        serverSide: true,
        order: [],
        searching: false,
        paging: false,
        info: false,

        ajax: {
            url: "<?php echo site_url('controller/fetch')?>",
            type: "POST",
            async: true,
            dataType: "json",

             success: function(data) {
             result = combine(data.data2);
console.log(result)
var keys = Object.keys(result)
                
for (var i = 0; i < keys.length; i++) {
  result[keys[i]].forEach(function(val) {

    val.forEach(function(value, index) {


      var entryIDs = index == 0 ? "entryIDM[]" : "entryIDW[]"
      var players = index == 0 ? "playerM[]" : "playerW[]"
      var levels = index == 0 ? "levelM[]" : "levelW[]"
      html += `<input type="text" name="${entryIDs}" value="${value.entryID}"> 
                 <input type="text" name="${players}" value="${value.player}">
                 <input type="text" name="${levels}" value="${value.level}">
                 `
    })
  })
}
document.getElementById("result").innerHTML = html //add html to div

                
               
              
                

            },
        },

        "columnDefs": [{
                "targets": [0], //first column
                "orderable": false, //set not orderable
            },
            {
                "targets": [-1], //last column
                "orderable": false, //set not orderable
            },

        ],
    });
});

【问题讨论】:

    标签: javascript ajax codeigniter codeigniter-3


    【解决方案1】:

    我建议在将重复的播放器传递给combine 函数之前删除它们。这样您就不会看到匹配的重复玩家。

    我会创建一个removeDuplicates 函数来从玩家列表中删除重复的玩家。

    在这个例子中,我们有 18 个玩家,每个玩家重复一次。

    我们通过 removeDuplicates 函数运行这些,现在我们有 9 个不同的玩家。

    然后我们将唯一的玩家传递给combine 函数,得到 3 组,每组 2 个匹配的玩家和 3 个不匹配的玩家。

    const players = Array.from({ length: 18 }, (v,k) => ( { level: Math.floor(k / 6) + 1, player: `test-${Math.floor(k/2)+1}` }));
    
    function removeDuplicates(players) {
       return Object.values(players.reduce((acc, curr) => { 
           acc[curr.player] = acc[curr.player] || curr;
           return acc;
       }, {}))
    }
    
    const combine = (source) => {
      return source.reduce((acc, curr) => {
        if (acc[curr.level]) {
          const levelArr = acc[curr.level];
          const last = levelArr[levelArr.length - 1];
          if (last.length === 2) {
            levelArr.push([curr])
          } else {
            last.push(curr)
          }
        } else {
          acc[curr.level] = [
            [curr]
          ];
        }
        return acc;
      }, {})
    };
    
    console.log("All players:", players);
    
    const uniquePlayers = removeDuplicates(players);
    
    console.log("Unique players:", uniquePlayers);
    
    const matched = Object.values(combine(uniquePlayers)).flatMap(a => a.filter(x => x.length === 2));
    const unmatched = Object.values(combine(uniquePlayers)).flatMap(a => a.filter(x => x.length === 1));
    console.log("Matched players:", matched);
    console.log("Unmatched players:", unmatched);

    【讨论】:

    • 您好,谢谢您的回复,我会应用它并研究它。一旦我测试了它,我会回来的。谢谢你。 ^_^ +1
    • 你好,我测试过了。我遇到了这个。 prnt.sc/18xf3j9 我试图用我的“结果”替换你的“玩家”,因为我正在用“结果”获取我的数据。我错过了什么吗?对不起,我是新手。我愿意学习。感谢您的时间。赞赏
    • 抱歉,我没有匹配您播放器对象的属性名称。我已经更新了答案。你可以再试一次!谢谢!
    • 谢谢,后续问题。如何从我的数据库中获取数据?根据您的示例,它来自您的“常量玩家”。有没有办法从数据库中获取我的?谢谢你。 prnt.sc/18ym5sk
    • 完美。谢谢和赞赏。
    猜你喜欢
    • 1970-01-01
    • 2016-02-07
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2021-07-30
    • 2021-11-24
    相关资源
    最近更新 更多