2014-09-03 7 views
0

У меня есть форма, где пользователи могут добавлять «строки» элементов. Скажем, каждая строка имеет «имя» и «слизню». Результатом этого является массив объектов, например:Для каждого дубликата в массиве найдите индекс первого дубликата

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

Теперь, если пользователь вводит это. Я хочу найти для каждого дубликата 'slug' индекс его первого появления, чтобы я мог показать ошибку проверки в этой строке. Я понимаю, что я легко могу удалить 0ds, но я все еще не уверен, какой лучший подход после этого будет. Любая помощь будет принята с благодарностью.

ответ

0

Опираться на ответ MARGUS', вы могли бы сделать что-то вроде этого:

Loop через массив хранения индекса первое появление пули в хэшмапе.

Затем, если вы сталкиваетесь с другим вхождением одного и того же слизняка, добавьте индекс первого вхождения в массив.

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; 
} 

Edit: фиксированная проверка существующего объекта и добавил fiddle here

+1

Спасибо, работал. Менялись спецификации, поэтому теперь я должен показывать ошибки во всех дубликатах, кроме первого (вздох). Изменено немного, чтобы использовать '_.each' подчеркивания (который, по их утверждению, быстрее в последней версии) и разрешить ввод ключа в качестве параметра. Результат здесь: http://jsbin.com/qunabinagiqu/2/ – Steven

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

+0

Обратите внимание, что это вызовет очередь всех повторяющихся индексов. – Margus

Смежные вопросы