【问题标题】:JavaScript - transform this data structureJavaScript - 转换这个数据结构
【发布时间】:2021-05-18 10:11:16
【问题描述】:

当我有这个数据结构的数组时:

[[3, 16, 1]
[3, 17, 1]
[3, 18, 1]
[3, 19, 1]
[3, 20, 1]
[3, 19, 1]
[3, 21, 1]
[3, 23, 1]
[3, 16, 1]
[3, 17, 1]
[2, 24, 1]
[2, 25, 1]
[2, 26, 1]
[2, 24, 1]]

我想计算数组元素并将其乘以数组的最后一个数字,如下所示:

[[3, 16, 2]
[3, 17, 2]
[3, 18, 1]
[3, 19, 2]
[3, 20, 1]
[3, 21, 1]
[3, 23, 1]
[2, 24, 2]
[2, 25, 1]
[2, 26, 1]]

我尝试这样做:

array.forEach(function(x) { 
    
    counts[x] = (counts[x] || 0)+1; 
    
});

但是这改变了数据结构,还有其他的形式可以做到吗?

【问题讨论】:

  • 不清楚问题在做什么。 [3,16,1] 和 [3,16,2] 都出现在输出数组中。
  • 对不起,我更改数据输出并删除 [3,16,1] 。我只想计算相等的数组并将其乘以它的最后一个值。有两个数组 [3,16,1] ,因此我乘以 2 [3,16, 1 * 2] 。
  • 不确定您的counts 函数是什么,所以我为您的问题编写了自己的函数。

标签: javascript arrays multidimensional-array


【解决方案1】:

我重写了你的函数和console.log 你想要的输出。 每当我检查一个新数组时,我会将其存储在 checkedArr 中,并会对其进行检查以防止重复记录。

const arr = [
  [3, 16, 1],
  [3, 17, 1],
  [3, 18, 1],
  [3, 19, 1],
  [3, 20, 1],
  [3, 19, 1],
  [3, 21, 1],
  [3, 23, 1],
  [3, 16, 1],
  [3, 17, 1],
  [2, 24, 1],
  [2, 25, 1],
  [2, 26, 1],
  [2, 24, 1],
];

const checkedArr = [];
const output = [];

for (let i = 0; i < arr.length; i++) {
  let count = 0;
  if (!isArrayChecked(arr[i])) {
    checkedArr.push(arr[i]);
    for (let j = i; j < arr.length; j++) {
      if (isArraySame(arr[i], arr[j])) {
        count++;
      }
    }
    output.push([arr[i][0], arr[i][1], count]);
  }
}

function isArrayChecked(array) {
  let exist = false;
  for (let k = 0; k < checkedArr.length; k++) {
    if (isArraySame(array, checkedArr[k])) {
      exist = true;
      break;
    }
  }
  return exist;
}

function isArraySame(arr1, arr2) {
  if (arr1[0] !== arr2[0] || arr1[1] !== arr2[1] || arr1[2] !== arr2[2])
    return false;
  return true;
}

console.log(output);

【讨论】:

    【解决方案2】:

    您的代码有问题在counts[x]。您不能使用数组来索引对象。

    您可以通过对数组进行字符串化来解决此问题。也就是说,使用:

    counts[String(x)] = (counts[String(x)] || 0)+1; 
    

    【讨论】:

    • 但这给出了一个对象,像这样 { 3, 16, 1: 2 , 3, 17, 1 : 2, 3, 18, 1 : 1, 3, 19, 1 : 2 , 3 , 20, 1: 1, 3, 21, 1: 1, 3, 23, 1: 1, 2, 24, 1: 2, 2, 25, 1: 1, 2, 26, 1: 1}。不是数组数组。
    【解决方案3】:
    
        let arr=[
         [3, 16, 1],
        [3, 17, 1],
        [3, 18, 1],
        [3,16,1],
        [3, 19, 1],
        [3, 20, 1],
        [3, 19, 1],
        [3, 21, 1],
        [3, 23, 1],
        [3, 16, 1],
        [3, 17, 1],
        [2, 24, 1],
        [2, 25, 1],
        [2, 26, 1],
        [2, 24, 1]]
    
        let solution = (arr) => {
          let obj = {};
          let result = [];
          for (let i of arr) {
            let keyOfObj = JSON.stringify(i);
            obj[keyOfObj] ? obj[keyOfObj]++ : obj[keyOfObj] = 1;
          }
          for (let [key, value] of Object.entries(obj)) {
            let objKeyArr = JSON.parse(key);
            if (value >= 2) {
              let lastElemt = objKeyArr[objKeyArr.length - 1];
              objKeyArr.splice(objKeyArr.length - 1, 1, lastElemt * value);
              result.push(objKeyArr);
            } else {
              result.push(objKeyArr);
            }
          }
          return result;
        };
      solution(arr)
    
    
    
    

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多