2014-03-28 48 views
0

尋找一種方法來有效地確定最低的正整數,該整數不被用作對象數組內任何對象中特定屬性的值。在javascript對象數組中找到第一個未使用的屬性值

換句話說,我正在尋找的功能/算法,對於這些陣列:

var example1 = [{ id: 1 }, { id: 2 }, { id: 3 }], 
    example2 = [{ id: 6 }, { id: 4 }, { id: 2 }], 
    example3 = [{ id: 2 }, { id: 1 }, { id: 4, otherProp: 3 }]; 

會分別返回4,1和3。 (在這個例子中很明顯使用id屬性。)

我考慮過使用Underscore.js,但是我找不到一個沒有一些醜陋嵌套循環的方法。有人有更好的主意嗎?

+0

這將是很好的繼續和共享代碼,你已經嘗試過哪怕是「醜陋的嵌套循環。」這將幫助人們瞭解你想要做的事情。 – CoderDennis

+2

你究竟在做什麼?這似乎是一件非常奇怪的事情需要。無論如何,如果不迭代數組中的對象,並且無論如何迭代遍歷屬性,都無法做到這一點。 – Pointy

+0

@CoderDennis我會盡力記住這一點。在這種情況下,我所有的方法都顯得過於複雜,以至於我太尷尬地分享它們。 – Waiski

回答

5
function next(prop) { 
    return function(arr) { 
     var used = arr.reduce(function(o, v) { 
      o[v[prop]] = true; 
      return o; 
     }, {}); 
     for (var i=1; used[i]; i++); 
     return i; 
    } 
} 
var nextId = next("id"); 

nextId([{ id: 1 }, { id: 2 }, { id: 3 }]) // 4 
nextId([{ id: 6 }, { id: 4 }, { id: 2 }]) // 1 
nextId([{ id: 2 }, { id: 1 }, { id: 4, otherProp: 3 }]) // 3 
+0

我認爲*他希望在每個對象的* all *屬性中找到最小的「未使用」整數。 – Pointy

+0

我發現這個解決方案比另一個更清潔,ES6'.findIndex'更好,但可悲的是隻適用於Chrome和Firefox nightlies atm。 –

+1

@Point我認爲不是,我想他想在一個場景中管理ID,在這個場景中元素可能會被刪除,並且它必須運行很長一段時間,所以他不想'用完數字'並重新使用ID :) –

3

一個可行的方法:

function aiKey(arr, prop) { 
    var indices = []; 
    arr.forEach(function(el) { 
    indices[ el[prop] ] = true; 
    }); 
    for (var i = 1, l = indices.length; i < l; i++) { 
    if (indices[i] === undefined) { 
     break; 
    } 
    } 
    return i; 
} 

aiKey(example1, 'id'); // 4 
aiKey(example2, 'id'); // 1 
aiKey(example3, 'id'); // 3 
相關問題