2012-12-24 52 views
2

對象的數組我不知道在對象的IndexOf在節點

的代碼是不工作的陣列使用的indexOf的是:

if (res.locals.company.companies.indexOf(req.query.companyId) >= 0) return next() 

if條件將始終返回false。

我在控制檯還測試,它實際上是錯誤的:

>> var zio = { __v: 1, 
    _id: '50bc0238049a1ff10b000001', 
    companies: 
    [ { _id: '50bc01938f164ee80b000001', name: 'Test' }, 
    { _id: '50bc01ac4e860ee90b000001', name: 'zio' } ], 
} 

>> zio.companies.indexOf("50bc01938f164ee80b000001") 
-1 

,而這應該是真實的。

我應該使用任何神祕的下劃線工具嗎?

UPDATE/Clarification:我的目的只是檢查是否存在其中一個ID,我不需要知道它的實際位置。這非常關鍵!

Nodejs的解決方案或提示將是驚人的!

+1

這看起來像一個MongoDB的查詢結果。直接在'find'查詢中執行此操作可能更好,而不是對其進行後期分析。 – JohnnyHK

+0

這是我從我的redis(緩存查詢)中檢索到的東西 – nick

回答

6

這沒有錯。那數組不包含字符串那樣,但只有兩個對象引用。因此,結果是正確的-1

要想從包含搜索字符串值對象引用指數,我們可以去像

var index; 
zio.companies.some(function(obj, idx) { 
    if(obj._id === '50bc01938f164ee80b000001') { 
     index = idx; 
     return true; 
    } 
}); 

console.log('index is: ', index); 

根據您的忍者的編輯,如果你只是想知道是否沒有一個對象ref持有一個特定的id被該陣列包含,使用它就像

var check = zio.companies.filter(function(obj) { 
    return obj._id === '50bc01938f164ee80b000001'; 
}); 

if(check.length) { 
    console.log('yep'); 
} else { 
    console.log('nope'); 
} 

第二次編輯:如果您真的只在執行後,您可能不希望在任何搜索中有任何函數調用開銷。我會使用類似於

function inObject(arr, search) { 
    var len = arr.length; 
    while(len--) { 
     if(arr[len]._id === search) 
      return true; 
    } 
} 

if(inObject(zio.companies, 'AAA')) { 
} 

該代碼超出了這裏提供的任何片段幾個大小。 See Here

+0

對於簡單的存在測試,爲什麼不使用'some'返回的布爾值而不是使用'filter'和單獨的'length'檢查? – JohnnyHK

+0

@JohnnyHK:是的,那當然也是絕對有可能的。我只是覺得在這裏用'.filter()'來做。 – jAndy

+0

我很想去這樣。顯然,for循環比filter/lenght和一些快:/ http://jsperf.com/json-stringify-vs-prototype-filter – nick

0

您需要遍歷元素並檢查_id是否相等。

indexOf檢查是否嚴格相等,這些對象當然不等於該字符串。 (這與"hello" === {foo: "hello"}的邏輯是一樣的,這永遠是錯誤的。)

我敢肯定,與節點有一些奇特的方式做到這一點,但裸JS的方法是:

var i, 
    arr = [{foo: 'bar'}, {foo: 'baz'}], 
    idx = -1; 
for (i = 0; i < arr.length; ++i) { 
    if (arr[i].foo === 'bar') { 
     idx = i; 
     break; 
    } 
} 

你也可以很容易地把它轉換成一個功能:

function indexOf(arr, pred) { 
    for (var i = 0; i < arr.length; ++i) { 
     if (pred(arr)) { 
      return i; 
     } 
    } 
    return -1; 
} 

雖然這會給你帶來更多詳細的使用(性能稍差),但如果你經常需要這樣做,它可能會更靈活一些。

console.log(indexOf(arr, function(elem) { return elem.foo === 'bar'; }); 
+0

是不是在節點上阻塞? – nick

+0

@haskellguy是的,但是一個異步indexOf會很愚蠢(並且需要更低級的代碼而沒有一些瘋狂的hackery)。 – Corbin

+0

我明白了,我明白了。在我看來,相當快地尊重其他人:) http://jsperf.com/json-stringify-vs-prototype-filter – nick

0

companies似乎是對象(未IDS)的陣列,其具有作爲Id的屬性之一。 indexOf函數用於查找匹配元素的索引。 由於您正在傳遞一個ID值來搜索索引,因此不會將其作爲數組中的元素查找,因此返回false。

爲了解決這個問題,你有兩個選擇:

  1. 反覆調整公司元素比較ID值,如果匹配,則返回true,否則爲false。

  2. indexOf函數中使用具有所需id的對象作爲參數。如果值大於-1,則返回true否則返回false。

0

.indexOf正在返回正確的輸出;你的數組沒有包含該字符串的元素。實際上,它是一個擁有兩個對象文字的數組。你不需要.indexOf的對象,而不是我們要作出自己的函數:

var inObject = function(object, val) { 

    for (var i in object) { if (object.hasOwnProperty(i)) { 

      if (obj[i] === val) { 

       return true; 
      } 

     } 

    } 
    return false; 
}; 

>>> inObject(zio.companies[0], '50bc01938f164ee80b000001'); 
    : true 
+0

是不是在節點上阻塞? – nick

+0

@haskellguy號碼如何阻止? – 0x499602D2