2017-05-01 83 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