Javascript 按属性在对象数组中查找重复项的最短方法
嗨,我有一个对象数组。每个对象都有一个对象数组。我需要在特定属性中找到具有相同值的(内部)对象的副本。我在循环中创建了一个循环,并使用includeJavascript 按属性在对象数组中查找重复项的最短方法,javascript,Javascript,嗨,我有一个对象数组。每个对象都有一个对象数组。我需要在特定属性中找到具有相同值的(内部)对象的副本。我在循环中创建了一个循环,并使用include 有没有一种更短的方法 // Verify that there are no duplicate device names. const streamItemNames = []; for (let i = 0, length1 = validateStreamItemsResults.streamWebSockets; i
有没有一种更短的方法
// Verify that there are no duplicate device names.
const streamItemNames = [];
for (let i = 0, length1 = validateStreamItemsResults.streamWebSockets; i < length1; i++) {
const streamItems = validateStreamItemsResults.streamWebSockets[i].streamItems;
for (let y = 0, length2 = streamItems.length; y < length2; y++) {
const streamItem = streamItems[i];
const streamItemNameLower = streamItem.streamItemName.trim().toLowerCase();
if (streamItemNames.includes(streamItemNameLower)) {
validateStreamItemsResults.errorMessage = `Duplicate stream items found with the name: ${streamItemNameLower}`;
return validateStreamItemsResults;
} else {
streamItemNames.push(streamItemNameLower);
}
}
}
如果您正在寻找更清晰、更短的代码,可以使用
flatMap
将每个streamItemName
提取到单个数组中,然后使用。查找
查找是否存在任何重复项:
const streamItemNames = validateStreamItemsResults.streamWebSockets.flatMap(
socket => socket.streamItems.map(
item => item.streamItemName.trim().toLowerCase()
)
);
const dupe = streamItemNames.find((name, i, arr) => arr.slice(i + 1).includes(name));
if (dupe) {
validateStreamItemsResults.errorMessage = `Duplicate stream items found with the name: ${dupe}`;
return validateStreamItemsResults;
}
如果您不需要知道重复的名称,您可以通过制作一个集合并将其
.size
与数组的长度进行比较来缩短它。请向我们展示您的对象的示例。请参阅。你说的“最短”是什么意思?以字节为单位?因为可能有多个副本,Arrayprototype.filter()不是更合适吗constdupes=streamItemNames.filter((name,i,arr)=>arr.slice(i+1).包括(name))代码>返回一个重复数组。从他的代码来看,OP似乎只需要一个重复。如果他想要一个数组而不是一个,那么是的,最好是.filter
Huh。你是对的。他明确表示,他只需要知道更新后的声明的括号中是否有任何重复项。
const streamItemNames = validateStreamItemsResults.streamWebSockets.flatMap(
socket => socket.streamItems.map(
item => item.streamItemName.trim().toLowerCase()
)
);
const dupe = streamItemNames.find((name, i, arr) => arr.slice(i + 1).includes(name));
if (dupe) {
validateStreamItemsResults.errorMessage = `Duplicate stream items found with the name: ${dupe}`;
return validateStreamItemsResults;
}