在基于另一个列表的列表中通过 属性 删除第一个匹配对象

Remove first matching object by property in a list based on another list

假设我们有一个对象数组,例如:

[ { LeadId: AABB , Phone: 1234 , } ,

{ LeadId: ABCD , Phone: 5678 , } ,

{ LeadId: EERR , Phone: 1234 , } ,

{ LeadId: FFGG , Phone: 5678 , } ]

还有一个 phone 数字数组:

[   1234 , 5678 , 6565  ]

我想删除第一个列表中每个 phone 数字的第一次出现,因此结果将是:

{ LeadId: EERR , Phone: 1234 , } ,

{ LeadId: FFGG , Phone: 5678 , }

假设 leadsToInsert 是我们需要从中删除事件的数组 phoneNumbers 是 phone 个数字

的数组

我试过下划线:

        const leftOvers = _.without(
          leadsToInsert,
          _.find(leadsToInsert, {
            Phone: phoneNumbers
          })
        );

当我运行这段代码时,leadsToInsert中的所有对象都保留下来,没有任何过滤。

我什么时候出错了?

您可以获取一个对象并将散列 table 设置为 true 以进行下一次过滤。

var data = [{ LeadId: 'AABB', Phone: 1234 }, { LeadId: 'ABCD', Phone: 5678 }, { LeadId: 'EERR', Phone: 1234 }, { LeadId: 'FFGG', Phone: 5678 }],
    omitFirst = [1234, 5678, 6565],
    result = data.filter(
        (seen => ({ Phone }) => !omitFirst.includes(Phone) || seen[Phone] || !(seen[Phone] = true))
        ({})
    );

console.log(result);

将 phones 数组转换为 Set, and the use Array.filter(), and delete the current phone from the Set. The Set.delete() 方法 returns true 如果项目已成功删除,否则 false。所以对于第一个项目 !phones.delete()false(从数组中删除该项目),而具有相同 phone 的其他项目将被保留。

const data = [{ LeadId: 'AABB', Phone: 1234 }, { LeadId: 'ABCD', Phone: 5678 }, { LeadId: 'EERR', Phone: 1234 }, { LeadId: 'FFGG', Phone: 5678 }]
const phones = [1234, 5678, 6565]

const phonesSet = new Set(phones)

const result = data.filter(({ Phone }) => !phonesSet.delete(Phone))

console.log(result)