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

时间:2019-02-28 08:21:58

标签: javascript

嗨,我有一组对象。每个对象都有对象数组。我需要查找在特定属性中具有相同值的(内部)对象的重复项。我决定在循环内创建循环并使用include。
有更短的方法吗?

    // Verify that there is 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);
            }
        }
    }

更新:
对象的结构如下,例如:
(我需要确定是否为true或false,如果存在重复的“ streamItemName”,则在本例中为true)。

const childArray1 = [ { streamItemName: 'Name1' }, { streamItemName: 'Name2' }, { streamItemName: 'Name3' }, { streamItemName: 'Name4' }];
const childArray2 = [ { streamItemName: 'Name5' }, { streamItemName: 'Name6' }, { streamItemName: 'Name7' }, { streamItemName: 'Name1' }];
const parentArray = [childArray1, childArray2];

1 个答案:

答案 0 :(得分:2)

如果您要查找更清晰,更短的代码,则可以使用flatMap将每个streamItemName提取到单个数组中,然后使用.find查找是否存在重复项:

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

如果您不需要知道重复的名称,则可以通过创建Set并将其.size与数组的length进行比较来使其更短。