将数组推入多维数组

3
我一直在尝试以下操作:我创建了一个包含URL列表的数组,这些URL来自于我的选定电子邮件,并且已经去重。我想按提供商对这些URL进行多维数组排序。我一直在搜索和尝试不同的方法,但无法使其工作...

我想创建一个多维数组,看起来像providers[z][y],其中[z]包含邮件来源的提供商列表,[y]是包含来自provider[z]的URL列表的数组。

我尝试以多种方式声明数组providers:var providers = [ [], [], [] ];(还添加了更多括号,只是为了确保列表中所有URL都有足够的位置), var providers = [];, var providers = {};等等。

我编写的代码如下:

    for (var y = 0; y < urlarray.length; y++) {
        var pos1;
        provider = urlarray[y].split(".")[1];
        if (providers.indexOf(provider) === -1) {
            providers.push(provider);
        }
        pos1 = providers.indexOf(provider);
        providers[pos1] = providers[pos1] || []; // should add an array???
        providers[pos1].push(urlarray[y]);
    }

代码似乎在 push 之后停止,因为数组 providers[0][0] 未定义。Thunderbird 似乎没有添加一个新的 y 数组 providers[pos1] = providers[pos1] || [];
我该如何让这段代码工作,以便 provider[z][y] 包含来自 provider[z] 的 URL?
同时,如果我想获取最大的 [y] 数组,唯一的方法是使用 for 循环计算所有对象,然后比较每个提供者的最大数字,还是有更简单的方法可行?以下是我如何操作的示例:
    var biggestarray = 0;
    for (var a = 0; a < providers.length; a++) {
        var counter = 0;
        for (var b = 0; b < 99; b++) { // kept it much bigger then needed
            if (provider[a][b] != undefined) {
                counter = b + 1;
            } else break;
        }
        if (biggestarray < counter) {
            biggestarray = counter;
        }
    }

有没有其他方法使b运行到provider[a][b]的长度,而不是上面的解决方案运行99次或直到中断?
希望你能再次为我指明正确的道路,这个问题让我发疯,因为它没有按我想要的方式工作;)
提前感谢。
问候ProphecyNL。

你有一些数据的例子吗? - Nina Scholz
1
是的,我会流式传输所有选定的电子邮件并将我搜索到的锚点保存到名为urlarray的数组中,它看起来像这样 var urlarray = ['url1','url2',等等]。如果可能的话,我想像providers [provider] [url]一样访问它们。 - ProphecyNL
谢谢,但您不能拆分 url1。它看起来像 example.com 吗? - Nina Scholz
完整的URL类似于https://www.example.com/sub/somepage.php。我只是将其拆分以获取提供者并将其用作ID。我从ProviderA、ProviderB等处收到多封电子邮件,并希望将来自ProviderA的所有链接链接到该数组。 - ProphecyNL
2个回答

1
这是一个带有单个循环和对象的建议,用于分组结果。

var urlarray = ['http://www.exa.com', 'http://www.example.com', 'http://www.test.org', 'http://www.test.info'],
    providers = {},
    biggest = [];

urlarray.forEach(function (a, i) {
    var provider = a.split(".")[1];
    providers[provider] = providers[provider] || [];
    providers[provider].push(a);
    if (!i || providers[biggest[0]].length < providers[provider].length) {
        biggest = [provider];
        return;
    }
    if (providers[biggest[0]].length === providers[provider].length) {
        ~biggest.indexOf(provider) || biggest.push(provider);
    }
});

document.write(biggest);
document.write('<pre>' + JSON.stringify(providers, 0, 4) + '</pre>');


谢谢,但是似乎Mozilla Thunderbird不愿意正确执行代码...我之前使用的是TB 38.xxx版本,已经升级到了45版本,但仍然没有任何改变。 - ProphecyNL
它在IE11、Edge和Chrome中运行良好。FF不确定。顺便说一句,它是ES5。 - Nina Scholz
1
好的,它正在工作...这是我的愚蠢错误,因为我读取了providers[0][0]而不是providers['providerA'][0]。这就是我一直犯的错误,我已经很久没有编程了;)感谢你的帮助!!! :) - ProphecyNL

0
我想在一个多维数组中按提供商对这些URL进行排序。
要对所有提供商的URL进行排序,请尝试:
providers.forEach(function(urlArr){
   urlArr.sort();
});

获取具有最大数组的提供程序索引
var biggestArrayIndex = -1;
var biggestArrayLength = 0;
providers.forEach(function(value, index){
   if (value.length > biggestArrayLength )
   {
      biggestArrayLength = value.length;
      biggestArrayIndex = index;
   }
})

现在提供程序中最大数组的索引biggestArrayIndex。你可以通过执行 - providers[biggestArrayIndex]来获取该数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接