【问题标题】:Count Value of multi dimensional array in JavascriptJavascript中多维数组的计数值
【发布时间】:2022-01-08 07:00:11
【问题描述】:
var sortedArr = [["Paul",     "1355"],
  ["Jennifer", "1910"],
  ["John",      "835"],
  ["John",      "830"],
  ["Paul",     "1315"],
  ["John",     "1615"],
  ["John",     "1640"],
  ["Paul",     "1405"],
  ["John",      "855"],
  ["John",      "930"],
  ["John",      "915"],
  ["John",      "730"],
  ["John",      "940"],
  ["Jennifer", "1335"],
  ["Jennifer",  "730"],
  ["John",     "1630"],
  ["Jennifer",    "5"]
];

我正在尝试查找每个键的总计数,例如,Paul 出现了 3 次,所以 Paul 应该计数 3 次。

然后想为它写下所有的值。例如 Paul 的值应该是 1355 1315 1405

应该像保罗 1355、1315、1405

我尝试了一些东西,但我遇到了一些问题,问题更多是关于逻辑。有人可以指导我吗?


  count = 1;
 var test;

//sortedArr = arr.sort();

for (var i = 0; i < sortedArr.length; i = i + count) {

  count = 1;
  test = [];
  test.push(sortedArr[i][1]);
 
  for (var j = i + 1; j < sortedArr.length; j++) {
  
    if (sortedArr[i][0] === sortedArr[j][0])
    {
      count++;
     // 
       test.push(sortedArr[j][1]);
       
  }
  }
  document.write(sortedArr[i][0]  +test +" = " + count + "<br>");
 
}

输出(错误)

Paul1355,1315,1405 = 3
John830,1615,1640,855,930,915,730,940,1630 = 9
John940,1630 = 2
Jennifer730,5 = 2
Jennifer5 = 1

输出应该是

Paul1355,1315,1405 = 3
John835, 830,1615,1640,855,930,915,730,940,1630 = 10
Jennifer1910, 1335, 730,5 = 4

谁能告诉我代码中的问题?

【问题讨论】:

    标签: javascript arrays multidimensional-array


    【解决方案1】:

    您的sortedArr 未排序,因此结果不稳定。 JavaScript中sort()直接修改数组,所以只需要添加

    sortedArr.sort();
    

    并且您的代码有效。

    var sortedArr = [["Paul",     "1355"],
      ["Jennifer", "1910"],
      ["John",      "835"],
      ["John",      "830"],
      ["Paul",     "1315"],
      ["John",     "1615"],
      ["John",     "1640"],
      ["Paul",     "1405"],
      ["John",      "855"],
      ["John",      "930"],
      ["John",      "915"],
      ["John",      "730"],
      ["John",      "940"],
      ["Jennifer", "1335"],
      ["Jennifer",  "730"],
      ["John",     "1630"],
      ["Jennifer",    "5"]
    ];
    
     count = 1;
     var test;
    
    sortedArr.sort();
    
    for (var i = 0; i < sortedArr.length; i = i + count) {
      count = 1;
      test = [];
      test.push(sortedArr[i][1]);
     
      for (var j = i + 1; j < sortedArr.length; j++) {    
        if (sortedArr[i][0] === sortedArr[j][0]) {
          count++; 
          test.push(sortedArr[j][1]);     
          }
      }
      document.write(sortedArr[i][0]  +test +" = " + count + "<br>");
    }

    【讨论】:

      【解决方案2】:

      尊重并理解您尝试解决问题的方式,您的逻辑是正确的,只是它需要一个排序列表,因为您的实现会跳过具有相似名称的连续条目 count 它必须为此进行排序。因此,在检查值之前对数组进行排序将为您提供正确的结果:

      sortedArr.sort((a, b) => b.toString().localeCompare(a.toString()));
      

      请注意,我已按降序对数组进行排序以匹配您的输出。如果您只是调用sortedArr.sort(),它也应该给出正确的结果,但输出顺序相反。

      【讨论】:

        【解决方案3】:

        可以先整理数据,再打印到文档中。

        1. 首先,您可以使用Array.prototype.reduce 遍历数组并将其转换为每个字段为&lt;perosn_name&gt; : &lt;array_of_values&gt; 的对象。

        2. 然后再次迭代以&lt;name&gt; = &lt;comma separated values&gt; = &lt;count&gt;的形式打印值(使用Object.entriesArray.prototype.forEach

        像下面这样试试

        var sortedArr = [
          ["Paul", "1355"],
          ["Jennifer", "1910"],
          ["John", "835"],
          ["John", "830"],
          ["Paul", "1315"],
          ["John", "1615"],
          ["John", "1640"],
          ["Paul", "1405"],
          ["John", "855"],
          ["John", "930"],
          ["John", "915"],
          ["John", "730"],
          ["John", "940"],
          ["Jennifer", "1335"],
          ["Jennifer", "730"],
          ["John", "1630"],
          ["Jennifer", "5"],
        ];
        
        // convert the data into the form described
        const output = sortedArr.reduce((prevValue, [name, value]) => {
          prevValue[name] ? prevValue[name].push(value) : (prevValue[name] = [value]);
          return prevValue;
        }, {});
        
        // write to the document
        Object.entries(output).forEach(([name, arr]) => {
          document.write(`${name} = ${arr.join(",")} = ${arr.length}<br>`);
        })

        注意:始终尝试使用内置的 Array 原型函数。大多数时候您可以使用它们并且易于阅读您的代码。

        【讨论】:

        • 想解释一下代码在做什么以及为什么 OP 应该使用它?
        • @Cjmarkham,用信息更新了答案
        【解决方案4】:

        把它们全部放在一个对象中,你就可以得到你想要的。

        const result = sortedArr.reduce((acc, curr) => {
          const [name, number] = curr
          if (acc[name]) {
            acc[name].push(number)
          } else {
            acc[name] = [number]
          }
          return acc
        },{})
        
        // you can use result["Paul"] to get the count of Paul
        // don't need to add count variable
        

        【讨论】:

        • 尽管您的解决方案可能有效(或者更有效/更干净)。 OP 提供了一个 sn-p 并明确要求“有人可以告诉我代码中的问题吗?”。在提供更好的替代方案/建议之前解决这个问题会更合适。
        • 我认为,如果你不重写整个事情,你不能简单地解决问题。
        【解决方案5】:

        您可以在此用例中使用 Map

        let map = new Map();
        
        sortedArr.forEach((item)=>{
          let [key, value] = item;
          if(!map.has(key)) {
            map.set(key, [])
          }
          map.get(key).push(value)
        })
        
        
        for(let [key, value] of map.entries()) {
          console.log(`${key} ${value} = ${value.length}`);
        }
        

        输出是

        Paul 1355,1315,1405 = 3
        Jennifer 1910,1335,730,5 = 4
        John 835,830,1615,1640,855,930,915,730,940,1630 = 10
        

        【讨论】:

          猜你喜欢
          • 2012-04-30
          • 2017-06-01
          • 2020-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-13
          • 1970-01-01
          • 2017-01-13
          相关资源
          最近更新 更多