2014-03-28 21 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 
相关问题