所以我有一个ObjectID数组,例如:
console.log(objectIdArray);
给出[ObjectID, ObjectID, ObjectID]
。
但是这里有重复,如映射到ID字符串时所见:
var idArray = objectIdArray.map(objectId => objectId.toString());
console.log(idArray);
提供["5afa54e5516c5b57c0d43227", "5afa54e5516c5b57c0d43227", "5afa54f0516c5b57c0d43228"]
,您可以在其中看到以 27 结尾的ID重复两次。
如何过滤此ObjectID数组以删除重复项(保留完整的 ObjectID 对象,而不仅仅是ID字符串值)?
答案 0 :(得分:1)
const removeDuplicates = inputArray => {
const ids = [];
return inputArray.reduce((sum, element) => {
if(!ids.includes(element.toString()){
sum.push(element);
ids.push(element.toString());
}
return sum;
}, []);
};
此解决方案将删除所有不具有特定ID的第一个对象的对象。
我们使用ids填充Array
,然后检查当前列表中是否已填写ID。
如果有很多元素,上面的解决方案可能会很慢,因为你需要检查inputArray
中每次迭代的 O(n)的id列表。将算法放在 O(n ^ 2)+ O(n)
相反,我们可以先根据toString()
对其进行排序,然后我们就可以验证当前ID与我们看到的最后一个ID是否匹配。
const removeDuplicates = inputArray => {
const sortedArray = inputArray.sort((a,b) => (a.toString() > b.toString() ? 1 : (a.toString() < b.toString() ? -1 : 0)));
let lastSeen = undefined;
return sortedArray.reduce((sum, element) => {
if(lastSeen !== element.toString()){
sum.push(element);
}
lastSeen = element.toString();
return sum;
}, []);
};
现在算法是 O(n log n)+ O(n)假设排序使用Merge Sort
答案 1 :(得分:0)
如果您使用ES6,您可以采用Sajeetharan的答案,但创建一组对象,而不是它们的ID:
let nodupes = [...new Set(objectIdArray)];
答案 2 :(得分:0)
我建议使用MongoDB Aggregation Pipeline来防止最终结果出现重复的ObjectId值。
然而:
// Define callback Function to receive modified Array
var receiveModifiedArray = function(objectIdArray) {
// log modified Array to console
console.log(objectIdArray);
}
// Remove duplicate ObjectId values
function removeDuplicateObjectIdValues(objectIdArray, callback) {
// Iterate through each ObjectId
objectIdArray.forEach((currentValue, index, array) => {
// evaluate Array items with index greater than 0
if(index > 0) {
// check ObjectId string values for type and value equality
if(currentValue.toString() == array[index -1].toString()) {
/**
* The splice() method changes the contents of an array
* by removing existing elements and/or adding new elements.
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
*/
objectIdArray.splice(index,1);
}
// If processing last item in Array, callback
if(index == array.length +1) {
callback(objectIdArray);
}
}
});
// Return to move on to next message in call stack
return;
}
// Remove duplicate ObjectId values
removeDuplicateObjectIdValues(objectIdArray,receiveModifiedArray);