2014-02-08 2 views
3

У меня есть массив Исключений, как показано ниже:Javascript удалить только первый матч в массиве в цикле

Exclusions: [ID:"233242", Loc:"West", ID:"322234" , Loc:"South"] 

Я также Object вложен с массив объектов, которые могли бы выглядеть примерно

Schools : [ O: [ ID:"233242" ] , 1:[ ID:"233242"] , 2: [ID :"954944"] ] 

Мне нужно удалить из объекта школы любые соответствующие индексы массива с тем же ID, но только для первого матча. Это означает, что элемент 0 должен быть удален, но элемент 1 все равно должен быть там. Какой самый лучший способ, чтобы исправить мой цикл:

$.each(Exclusions, function (index, value) { 
    var loc = value.Loc; 
    var ID = value.ID; 
    Object.keys(Schools.District.Pack[loc]).forEach(function (key) { 
     //i need to scan through the entire object 
     if (Schools.District.Pack[loc].ID === ID) { 
      //remove the first match now stop looking 
      Schools.District.Pack[loc].splice(key, 1); 

      //break ; incorrect 
     } 
    }); 
}); 
+0

'return false' завершает каждый цикл, но поскольку у вас есть два из них, вам также необходимо установить какой-то флаг во внутреннем цикле, который вы можете проверить на внешнем, чтобы это тоже. – CBroe

+0

@Cbroe Я думал об использовании IndexOf, но это не работает, плюс я думаю, что другое сканирование массива слишком интенсивно – Edward

ответ

1

Я бы сказал, что имея еще один массив подстановок для удаленных идентификаторов, и вам нужно что-то вроде этого

var Exclusions = [{ID:"233242", Loc:"West"}, {ID:"322234" , Loc:"South"}]; 
var Schools = [{ ID:"233242" } ,{ ID:"233242"} , {ID :"954944"} ]; 

var removedKeys = []; 

$.each(Exclusions, function (index, value) { 
    var loc = value.Loc; 
    var ID = value.ID; 
    Object.keys(Schools).forEach(function (key) { 
     //i need to scan through the entire object   
     if ((Schools[key].ID === ID) && (removedKeys.indexOf(ID) == -1)) { 
      removedKeys.push(ID); 
      //remove the first match now stop looking    
      delete Schools[key]; 
     } 
    });  
}); 
console.log(removedKeys); 
console.log(Schools); 

Надеется, что это поможет

fiddle

+0

Мне нравится этот подход, проблема с delete заключается в том, что этот элемент массива не определен, а не удаляет его из массива целиком, но он работает. – Edward

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