将两个或多个具有相似值的数组一起添加到一个数组中

时间:2019-06-13 07:37:18

标签: javascript arrays database merge

我有一个数组,其中包含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
*/

3 个答案:

答案 0 :(得分:0)

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

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; }

答案 1 :(得分:0)

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);

答案 2 :(得分:0)

确定您的评论,我想您正在寻找这样的东西:

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);

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