基于两个值的打字稿中的数组迭代

时间:2019-07-19 13:45:23

标签: javascript arrays angular typescript

这个问题可能是一个简单的迭代,但我陷入了逻辑。

我有一个需要根据 id code 进行迭代的数据数组,并且仅在给定id中不存在代码时才删除数据。 / p>

这是案例方案, 根据以下数据,

  1. 有两个名为“ GOOGLE”的不同代码,其ID不同-有效大小写
  2. 有两个具有不同ID的名为“ FACEBOOK”的不同代码-有效案例
  3. 有一个名为“ TWITTER”的代码在另一个ID(无效的情况)中不存在。

在这里,我想根据情况3删除此数据。

 {
  "id" : 378,
  "code" : "TWITTER",
  "comment" : "zeeer"
}

有人可以在这种情况下帮助我吗?

****下面是原始数组数据****

 data = [ {
  "id" : 381,
  "code" : "GOOGLE",
  "comment" : "ffff"
}, {
  "id" : 381,
  "code" : "FACEBOOK",
  "comment" : "fff"
}, {
  "id" : 378,
  "code" : "TWITTER",
  "comment" : "zeeer"
}, {
  "id" : 378,
  "code" : "GOOGLE",
  "comment" : "rferer"
}, {
  "id" : 378,
  "code" : "FACEBOOK",
  "comment" : "fefehh"
} ]

我在下面尝试了一些方法,但是不确定在此之后如何进行。

而且,我使用的是angular 7,如果我得到基于打字稿的解决方案,将会很有帮助。

this.data.forEach((row, index) => {
        let value = row.id;
        if(originalArray.indexOf(value) == -1) {
          console.log(value);
        }
        originalArray.push(row);
     })

3 个答案:

答案 0 :(得分:1)

尝试一下:

 data = [ {
  "id" : 381,
  "code" : "GOOGLE",
  "comment" : "ffff"
}, {
  "id" : 381,
  "code" : "FACEBOOK",
  "comment" : "fff"
}, {
  "id" : 378,
  "code" : "TWITTER",
  "comment" : "zeeer"
}, {
  "id" : 378,
  "code" : "GOOGLE",
  "comment" : "rferer"
}, {
  "id" : 378,
  "code" : "FACEBOOK",
  "comment" : "fefehh"
} ]

var result = data.reduce((unique, o) => {
    if(data.filter(obj => obj.id != o.id && obj.code === o.code).length>=1) {
      unique.push(o);
    }
    return unique;
},[]);

console.log(result);

答案 1 :(得分:1)

“删除任何不匹配的代码+ ID对”的逻辑似乎与您的前两种情况直接矛盾,因为这些对不匹配 -ID不同。

无论如何,下面的代码将只保留重复的code与不同的id的项目。

const data = [ { "id" : 381, "code" : "GOOGLE", "comment" : "ffff" }, { "id" : 381, "code" : "FACEBOOK", "comment" : "fff" }, { "id" : 378, "code" : "TWITTER", "comment" : "zeeer" }, { "id" : 378, "code" : "GOOGLE", "comment" : "rferer" }, { "id" : 378, "code" : "FACEBOOK", "comment" : "fefehh" } ];
let result = data.filter(({id,code}) => !!data.find(obj => obj.code === code && obj.id !== id));
console.log(result);

理想情况下,您在这里不需要嵌套的数组方法,而是需要一个查找/哈希图来防止不必要的迭代,但是看到您已经接受了一个答案,我现在就放弃。

答案 2 :(得分:0)

和Lodash

const data = [ {
      "id" : 381,
      "code" : "GOOGLE",
      "comment" : "ffff"
    }, {
      "id" : 381,
      "code" : "FACEBOOK",
      "comment" : "fff"
    }, {
      "id" : 378,
      "code" : "TWITTER",
      "comment" : "zeeer"
    }, {
      "id" : 378,
      "code" : "GOOGLE",
      "comment" : "rferer"
    }, {
      "id" : 378,
      "code" : "FACEBOOK",
      "comment" : "fefehh"
    } ];

    const groupedData = _.groupBy(data, 'code'); // import * as _ from 'lodash'

    console.log(data.filter(entry => groupedData[entry.code].length > 1));

结果:

[Object, Object, Object, Object]
0: Object
code: "GOOGLE"
comment: "ffff"
id: 381
__proto__: Object
1: Object
code: "FACEBOOK"
comment: "fff"
id: 381
__proto__: Object
2: Object
code: "GOOGLE"
comment: "rferer"
id: 378
__proto__: Object
3: Object
code: "FACEBOOK"
comment: "fefehh"
id: 378
__proto__: Object