首页 > 解决方案 > Javascript检查二维数组更新中是否存在值,否则创建

问题描述

我正在为谷歌饼图
创建一个二维数组 数组必须是格式

[
  //category, value
   [2,     11],
   [5,      2],
   [6.6,    2],
   [7.7,    2],
   [8.8,    7]
]

我想要得到的是一个函数,其中类别被传递给函数。如果类别存在,则值以 1 (value++) 递增。如果没有,则应创建值为 1 的记录。
我为此在互联网上找到了部分解决方案,但我似乎无法使其工作。
我想我已经接近了,但我正在创建无限循环。如果有人能指出我正确的方向,那就太好了!(不需要以此为依据,我只需要一个简单明了的工作功能)

var array = [];

function updateArray(category) {
    for (var z = 0; key = array[z]; z++) {
        if (key.includes(category)) {
            var value = key[1];
            key[1] = [ category, value++ ];
            console.log("category updated");
        } else {
            array.push( [ category, 1 ]);
            console.log("category created");
        }
    }
}

编辑:起初数组是空的。
然后我读取了本地存储中与日期格式键 (DD-MM-YYYY) 匹配的每条记录,这里没有问题。
例如,在某个键的字段中遇到例如 5 时,数组应如下所示:

[
  [5, 1]
]

当另外遇到 5、6、10 和 5 时,这应该是结果:

[
  [5, 3],
  [6, 1],
  [10, 1]
]

希望这能让它更清楚。

标签: javascriptarraysmultidimensional-array

解决方案


那里有几个问题:

  1. 您正在寻找 中的category 任何地方key但您说只有子数组中的第一个条目用于类别(第二个用于值)。

  2. 您正在key[1]使用新数组进行更新,而不仅仅是更新的值。

  3. 如果键不包含类别,则您将推送到您正在循环的数组,因此假设类别不在您检查的第一个数组中,您将永远找不到它并且有一个无限循环。

我会把它分成几部分:

  • 找到入口,然后
  • 如果没有,请更新或添加一个
function updateArray(category) {
    const entry = array.find(([cat]) => cat === category);
    if (entry) {
        // Update the value
        ++entry[1];
        console.log("category updated");
    } else {
        // Add a new entry
        array.push([category, 1]);
        console.log("category created");
    }
}

现场示例:

const array = [
  //category, value
   [2,     11],
   [5,      2],
   [6.6,    2],
   [7.7,    2],
   [8.8,    7]
];
function updateArray(category) {
    const entry = array.find(([cat]) => cat === category);
    if (entry) {
        // Update the value
        ++entry[1];
        console.log("category updated");
    } else {
        // Add a new entry
        array.push([category, 1]);
        console.log("category created");
    }
}

console.log("Before:", JSON.stringify(array, null, 4));
updateArray(5); // Updates the second entry in the array
console.log("After: ", JSON.stringify(array, null, 4));


旁注:我还建议传递array给函数,以便它可以重用,而不是关闭array.


推荐阅读