gpt4 book ai didi

javascript - 比较两个列表以查找新元素、删除的元素和现有元素

转载 作者:行者123 更新时间:2023-12-01 01:44:24 24 4
gpt4 key购买 nike

我有两个这样的字符串列表:

let previous_id = ["5b7b5498ab3f510e307e7d04", "5b7ae97cc6d75e1331e28d9c", "5b7a0c207fab2722a2081caf"];
let current_id = ["5b7b5498ab3f510e307e7d04", "5b83e3b4412f370bd7b9a05d"];

我想比较两个列表的所有元素,以便知道哪一个仍在列表中,哪一个是新的,哪一个已被删除。

结果将是:

delete_id = ["5b7ae97cc6d75e1331e28d9c", "5b7a0c207fab2722a2081caf"];
new_id = ["5b83e3b4412f370bd7b9a05d"];
existing_id = ["5b7b5498ab3f510e307e7d04"];

有什么功能可以做到这一点吗?

我想避免使用多个 if 条件执行两个循环,如下所示:

let previous_id = ["5b7b5498ab3f510e307e7d04", "5b7ae97cc6d75e1331e28d9c", "5b7a0c207fab2722a2081caf"];
let current_id = ["5b7b5498ab3f510e307e7d04", "5b83e3b4412f370bd7b9a05d"];

delete_id = [];
new_id = [];
existing_id = [];

for(let item of previous_id){
let index = current_id.indexOf(item);
if(index == -1){
delete_id.push(item);
} else {
existing_id.push(item);
}
}

for(let item of current_id){
let index = previous_id.indexOf(item);
if(index == -1){
new_id.push(item);
}
}


console.log(delete_id)
console.log(new_id)
console.log(existing_id)

最佳答案

我会在集合操作之上构建您的数组操作。由于不应存在重复项,因此这是内部计算的正确结构。我不知道为什么 Set.prototype 至少没有 unionintersectiondifference ,但是自己编写它们非常简单。

// Set operations

const intersection = (set1, set2) => new Set([...set1].filter(x => set2.has(x)))
const difference = (set1, set2) => new Set([...set1].filter(x => !set2.has(x)))


// Array operations, builtt using the set ones
// NB: Arrays are NOT Sets, and there is some information lost in the conversion.
// But Sets are the proper data structure for unordered collections of unique values.

const intersectionA = (arr1, arr2) => Array.from(intersection(new Set(arr1), new Set(arr2)))
const differenceA = (arr1, arr2) => Array.from(difference(new Set(arr1), new Set(arr2)))


// Main code

const breakdown = (prev, curr) => ({
delete_id: differenceA(prev, curr),
new_id: differenceA(curr, prev),
existing_id: intersectionA(prev, curr)
})

let previous_id = ["5b7b5498ab3f510e307e7d04", "5b7ae97cc6d75e1331e28d9c", "5b7a0c207fab2722a2081caf"];
let current_id = ["5b7b5498ab3f510e307e7d04", "5b83e3b4412f370bd7b9a05d"];

console.log(breakdown(previous_id, current_id))

如果您对多个循环的反对与代码膨胀有关,那么这可能会有所帮助。如果您认为多个循环是应用程序中的性能瓶颈(您已经对此进行了测试,对吧?),那么这根本没有帮助,因为它会针对您想要的每个输出单独循环,并且在数组之间的转换上还有额外的工作和集。但如果这些导致应用程序出现严重瓶颈,我会感到非常惊讶。

关于javascript - 比较两个列表以查找新元素、删除的元素和现有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52082003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com