对于数组中的每个副本,找到第一个副本的索引

时间:2014-09-03 10:22:14

标签: javascript arrays duplicates

我有一个表单,用户可以在其中添加"行"的项目。让我们说每一行都有一个"名称"和" slug"。这是一个对象数组的输出,如下所示:

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

现在,给定用户输入此内容。 我想为每个重复'slug'找到它的第一次出现的索引,以便我可以在该行上显示验证错误。我知道我可以很容易地_.pluck ids,但我仍然不确定之后的最佳方法是什么。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

扩展Margus&#39;回答,你可以这样做:

循环遍历存储hashmap中第一次出现的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