2014-09-03 163 views
0

我有一個表單,用戶可以在其中添加項目的「行」。假設每一行都有「名稱」和「slu」「。這是一個對象陣列,如下所示:對於數組中的每個副本,找到第一個副本的索引

[ 
{ 
"name": "Bananas", 
"slug": "bananas" 
},{ 
"name": "Bananas", 
"slug": "bananas" 
},{ 
"name": "Silver Spoons", 
"slug": "silver_spoons" 
},{ 
"name": "Silver Spoons", 
"slug": "silver_spoons" 
} 
] 

現在,給定用戶輸入這個。 我想爲每個重複的'slug'找到其第一次出現的索引,以便我可以在該行上顯示驗證錯誤。我知道我可以很容易地將_.pluck這個ID出來,但我仍然不確定那之後最好的方法是什麼。任何幫助將不勝感激。

回答

0

擴展在Margus的回答,你可以做這樣的事情哈希映射中第一次出現slug。

然後,如果遇到另一個相同的slug,請將第一個匹配項的索引添加到數組中。

function getFirstOccurences(arr) { 
    var items = {}; 
    var alreadyExist = []; 
    arr.forEach(function(item, index) { 
     if(items.hasOwnProperty(item.slug)) { 
      alreadyExist.push(items[item.slug]); 
     } 
     else { 
      items[item.slug] = index; 
     } 
    }); 
    return alreadyExist; 
} 

編輯:現有項目的固定檢查和添加fiddle here

+1

謝謝,工作過。規格改變,所以我現在必須顯示除第一個(嘆氣)以外的所有重複項上的錯誤。修改了一下使用下劃線的'_.each'(他們聲稱在最新版本中聲稱速度更快),並允許將鍵作爲參數輸入。結果在這裏:http://jsbin.com/qunabinagiqu/2/ – Steven 2014-09-03 12:02:05

0

您可以使用jQuery inArray

var items = [ 
    { 
    "name": "Bananas", 
    "slug": "bananas" 
    },{ 
    "name": "Bananas", 
    "slug": "bananas" 
    },{ 
    "name": "Silver Spoons", 
    "slug": "silver_spoons" 
    },{ 
    "name": "Silver Spoons", 
    "slug": "silver_spoons" 
    } 
]; 
var names = []; 
var duplicates = []; 
for(var i = 0; i < items.length; i++) { 
    var value = items[i].name; 
    if ($.inArray(value, names) > -1) { 
     duplicates.push(i); 
    } else { 
     names.push(value); 
    } 
} 
alert(names.toString()); 
alert(duplicates.toString()); 

實例:通過陣列中存儲的索引

循環:jsFiddle

+0

我不太確定,將如何得到我我正在尋找的結果。我期望的是第一個重複項的一系列索引。所以在上面的例子中,我期望[0,2]。你能詳細說明這可能會如何幫助我到達那裏嗎? – Steven 2014-09-03 10:39:34

+0

請注意,這將排隊所有重複的索引。 – Margus 2014-09-03 11:04:30

相關問題