在过滤之前引发异常?

时间:2019-09-23 19:55:14

标签: javascript node.js

在过滤items之前,它将检查removeId中是否存在items,否则将引发异常。有没有办法避免两个循环?这段代码可能因为两个循环而被错误地编写。

const items = [
    { "Id": 111 },
    { "Id": 111 },
    { "Id": 222 },
    { "Id": 222 },
    { "Id": 333 },
    { "Id": 333 },
]

const removeId = 222;
const find = items.some(item => item.Id === removeId);

if (!find) {
    throw new Error(`Id not found: ${removeId} `);
}

const filteredItems = items.filter(item => item.Id !== removeId);

console.log(filteredItems);

1 个答案:

答案 0 :(得分:1)

如果您打算立即抛出错误以避免出现filter部分,则无论如何您都必须遍历数组。因此,您无法避免至少迭代一次数组。。您可以检查过滤后的数组和原始数组的长度是否相同,以查看是否需要引发异常并执行该操作。同时过滤。

const items = [
    { "Id": 111 },
    { "Id": 111 },
    { "Id": 222 },
    { "Id": 222 },
    { "Id": 333 },
    { "Id": 333 }
];

const removeId = 222;

const filteredItems = items.filter(item => item.Id !== removeId);

if (filteredItems.length === items.length) {
    throw new Error(`Id not found: ${removeId} `);
}

console.log(filteredItems);

如果您仍然担心效率,可以用Array循环替换Array#filter方法调用(即for (;;))。

更新

在现代浏览器中,Array方法的效率与for循环一样高(Bergi揭示了信息)