检查一个属性是否存在于一系列物体中,而无需循环



我有一系列对象:

let arr = [{"id":1, "name": "abc"},{"id":2, "name": "fsd"},{"id":3, "name": "fasd"},{"id":4, "name": "fsdfas"},{"id":5, "name": "fad"},{"id":6, "name": "fasdf"},{"id":7, "name": "fasd"},{"id":8, "name": "fasdf"},{"id":9, "name": "fasdfs"},{"id":10, "name": "abc"}]

如何在不使用任何类型的循环语句的情况下检查一系列对象中是否存在属性'id"?一旦找到返回一些字符串或任何东西。

在一般情况下,您不能;某种循环结构是必要的。循环可能会在您的代码中,但它会在那里。例如,即使您拿起数组并通过JSON.stringify运行它,然后尝试在结果上使用正则拨号,a( 这将是一个坏主意™: - (和b( 仍然会有循环(在JSON.stringify中,也可能在正则处理中(。此外,开销远不仅要比进行自己的循环更高。

如果 在您的情况下,您会提前知道对象都具有相同的属性,那么您只需检查第一个:

if ("id" in arr[0])

...但是,只有当您事先知道它们都具有相同的属性。

伸展一个点,in必须检查对象,如果找不到属性,则其原型  mdash;可能包括一个循环。:-)(当然,任何财产访问都必须这样做。(因此,您可能更喜欢

if (arr[0].hasOwnProperty("id"))

...从理论上讲,也可能涉及通过原型循环找到hasOwnProperty方法(实际上,在现代引擎上,它不会(。

您可以使用正则表达式并检查字符串的数组。

let arr = [{"id":1, "name": "abc"},{"id":2, "name": "fsd"},{"id":3, "name": "fasd"},{"id":4, "name": "fsdfas"},{"id":5, "name": "fad"},{"id":6, "name": "fasdf"},{"id":7, "name": "fasd"},{"id":8, "name": "fasdf"},{"id":9, "name": "fasdfs"},{"id":10, "name": "abc"}],
    json = JSON.stringify(arr);
console.log(/"id":3(,|})/.test(json));
console.log(/"id":42(,|})/.test(json));

您可以获得的最接近的是创建一个函数,该函数串起您的数组,然后使用正则表达式来查找类似的特定ID值:

正则表达式.test()(内部(在JSON字符串中的字符上迭代,因此在基础级别上,您的要求是不可能的。

let arr = [{"id":1, "name": "abc"},{"id":2, "name": "fsd"},{"id":3, "name": "fasd"},{"id":4, "name": "fsdfas"},{"id":5, "name": "fad"},{"id":6, "name": "fasdf"},{"id":7, "name": "fasd"},{"id":8, "name": "fasdf"},{"id":9, "name": "fasdfs"},{"id":10, "name": "abc"}];
function idExistsInArray(array, id) {
    var regex = new RegExp(""id":" + id + "(,|})");
    return regex.test(JSON.stringify(array));
}
console.log(idExistsInArray(arr, 1));
console.log(idExistsInArray(arr, 3));
console.log(idExistsInArray(arr, 55));

最新更新