Javascript 按属性在对象数组中查找重复项的最短方法

Javascript 按属性在对象数组中查找重复项的最短方法,javascript,Javascript,嗨,我有一个对象数组。每个对象都有一个对象数组。我需要在特定属性中找到具有相同值的(内部)对象的副本。我在循环中创建了一个循环,并使用include 有没有一种更短的方法 // Verify that there are no duplicate device names. const streamItemNames = []; for (let i = 0, length1 = validateStreamItemsResults.streamWebSockets; i

嗨,我有一个对象数组。每个对象都有一个对象数组。我需要在特定属性中找到具有相同值的(内部)对象的副本。我在循环中创建了一个循环,并使用include
有没有一种更短的方法

    // 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;
}