【问题标题】:Adding two or more arrays with similar values together into one array将两个或多个具有相似值的数组一起添加到一个数组中
【发布时间】:2019-10-27 18:08:07
【问题描述】:

我有一个数组,它包含 100 个数组,每个数组有 3160 个值的对象有两个值,一个是序列号(我认为该数字仅在存在 1 时出现),另一个是0 或 1。

我想将所有 100 个数组组合成一个数组,其中包含一个对象的 3160 个值,该对象具有两个值,所有 100 个数组中包含的所有序列号的列表,以及所有 0 和 1 的总和。

我尝试过连接,但我不想超过 3160 个条目

/*results of what I have
  Array(100)
    [0]Array(3160)
      [0]: Seq: 12345
           fq: 1
      [1]: Seq: 12345
           fq: 0
      [2]: Seq: 12345
           fq: 1
      [3]: Seq: 12345
           fq: 0
      and so on...
    [1]Array(3160)
      [0]: Seq: 12346
           fq: 1
      [1]: Seq: 12346
           fq: 1
      [2]: Seq: 12346
           fq: 0
      [3]: Seq: 12346
           fq: 0
      and so on...
    [2]Array(3160)
      [0]: Seq: 12347
           fq: 1
      [1]: Seq: 12347
           fq: 0
      [2]: Seq: 12347
           fq: 1
      [3]: Seq: 12347
           fq: 0
      and so on...
    and so on...


What I Want:
    Array(3160)
      [0]: Seq: 12345, 12346, 12347
           fq: 3
      [1]: Seq: 12346
           fq: 1
      [2]: Seq: 12345, 12347
           fq: 2
      [3]: Seq: 
           fq: 0
*/

【问题讨论】:

  • 请添加一些与想要的结果匹配的数据,反之亦然。请以文字表示法添加数据(就像您使用 JSON.stringify 得到的一样)
  • 如果你在代码中向下滚动,它会显示我希望它们如何相加
  • 对不起,我对编码非常陌生,我不知道文字符号是什么,我只想得到一个添加前 100 个名称的数组值到一个总数的数组中。我只是在使用 javascript。

标签: javascript arrays database merge


【解决方案1】:

好吧,鉴于您的 cmets,我猜您正在寻找这样的东西:

let array = [[{Seq: 12345, fq: 1}, {Seq: 12345, fq: 0}],
             [{Seq: 12346, fq: 1}, {Seq: 12346, fq: 1}],
             [{Seq: 12346, fq: 1}, {Seq: 12346, fq: 1}],
             [{Seq: 12347, fq: 1}, {Seq: 12347, fq: 0}]];

let output = new Array();
             

array.forEach(entrie => entrie.forEach((obj, index) => {
  if(obj.fq) {
    output[index] = output[index] || {Seq: [], fq: 0};
    if(!output[index].Seq.includes(obj.Seq)) output[index].Seq.push(obj.Seq);
    output[index].fq += obj.fq;
  }
}));

console.log(output);

由于它与您在问题中描述的有点不同,我更喜欢创建一个新答案而不是编辑第一个答案。

【讨论】:

    【解决方案2】:

    let array = [[{Seq: 12345, fq: 1}, {Seq: 12345, fq: 0}],
                 [{Seq: 12346, fq: 1}, {Seq: 12346, fq: 1}],
                 [{Seq: 12347, fq: 1}, {Seq: 12347, fq: 0}]];
    
    let output = new Array();
                 
    
    array.forEach(entrie => entrie.forEach((obj, index) => {
      if(obj.fq) {
        output[index] = output[index] || {Seq: [], fq: 0};
        output[index].Seq.push(obj.Seq);
        output[index].fq += obj.fq;
      }
    }));
    
    console.log(output);

    【讨论】:

    • 太棒了,这个工作太棒了,但是有没有办法让序列号存储为数字数组而不是字符串?
    • 哦,该死的。这个频率正确,但它只存储最近的序列号,刚刚注意到。我还不知道是这个代码还是我的代码
    • 对,所以我的海量数组确实记录了所有正确的数字,但是在运行您的缩减代码之后,频率是正确的,但是您的代码只是重复复制最近的序列号,而不是记录完整的序列号出现 1 的序列
    • 我编辑了我的答案以创建一个数组而不是一个字符串,但是如果您只重复获取最后一个序列值,这意味着您的数组是错误的,因为正如您通过运行此示例所看到的那样,鉴于您的预期结果,输出是正确的
    【解决方案3】:

    您可以迭代数组并在与给定内部数组相同的索引上构建新项目。

    var data = [[{ Seq: 12345, fq: 1 }, { Seq: 12345, fq: 0 }, { Seq: 12345, fq: 1 }, { Seq: 12345, fq: 0 }], [{ Seq: 12346, fq: 1 }, { Seq: 12346, fq: 1 }, { Seq: 12346, fq: 0 }, { Seq: 12346, fq: 0 }], [{ Seq: 12347, fq: 1 }, { Seq: 12347, fq: 0 }, { Seq: 12347, fq: 1 }, { Seq: 12347, fq: 0 }]],
        result = data.reduce((r, a) => {
            a.forEach(({ Seq, fq }, i) => {
                if (!fq) return;
                r[i] = r[i] || { Seq: [], fq: 0 };
                r[i].Seq.push(Seq);
                r[i].fq++;
            });
            return r;
        }, []);
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 我会在早上试试这个,现在就去睡觉
    • 不应该 r[i].fq++;r[i].fq+=fq; 吗?
    • @PopHip,可能是,但 "... 是 0 或 1 ..."
    • 当我运行这个时它告诉我 a.forEach 不是一个函数
    • a 是一个数组吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多