2017-05-01 48 views
-5

我有对象的数组这样:检查没有遍历它

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”对象是否数组中存在,而无需使用任何一种循环语句?一旦找到返回一些字符串或任何东西例如。

+3

你怎么可以遍历数组,检查每一个元素没有一个循环? – Li357

+0

你只是指'arr [0] .hasOwnProperty('id');'? – Marie

+0

使用Array.Reduce? –

回答

2

在一般情况下,您不能;某种循环结构是必要的。循环可能会或可能不在您的代码中,但它会在那里。例如,即使你把这个数组运行过并且通过JSON.stringify然后尝试对结果使用正则表达式,A) 这将是一个坏主意™:-)和B) 仍然会有循环(在JSON.stringify中,也可能在正则表达式处理中)。此外,开销将远远高于只做你自己的循环。

如果,你的情况,你知道提前这些对象都具有相同的属性集,那么你可以只检查第一个:

if ("id" in arr[0]) 

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

拉伸一个点,in必须检查对象,如果找不到属性,它的原型  —可能包含一个循环。 :-)(当然,任何属性的访问可能不得不这样做。)所以,你可能更喜欢

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

...也从理论上来说,太可能涉及通过原型循环找到hasOwnProperty方法(在练习,在现代引擎上,它不会)。

+1

'if(“prop”in obj)'循环遍历对象的属性 – mhodges

+1

@mhodges - 可能不是。它可能在某种属性索引中使用哈希查找(尽管详细信息是JS实现的内部特性)。 – jfriend00

+0

@mhodges:不,它没有。 (也许你正在考虑“原地”?)它检查**如果**属性存在。该操作的机制取决于实施。 (但是我应该使用'hasOwnProperty'而不是'in',因为它必须通过对象的原型来“循环”,但是,任何属性查找都可以。) –

0

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

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

+2

stringify和正则表达式中仍然存在循环。如果没有使用循环的某个代码片段,您无法查看数组或字符串。 – jfriend00

+0

即使与索引检查涉及循环。 –

+0

击败我33秒哈哈...... IMO这是唯一合理的解决方案 – mhodges

0

你可以得到的最接近是创建stringifies您的数组,然后函数使用正则表达式来查找特定的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));

+1

stringify和正则表达式中仍然存在循环。如果没有使用循环的某个代码片段,您无法查看数组或字符串。 – jfriend00

+1

你在''id“:100'上得到'true'并且只查找'1'。 –

+0

@NinaScholz好的,我错过了 - 固定 – mhodges