2016-02-06 4 views
0

Так что у меня есть немного трудностей, пытаясь придумать лучший способ сделать это в javascript. Я хочу удалить массив несортированных индексов из массива, который был X числом элементов. НапримерУдаление массива индексов из заданного массива

var index = [ 0, 7, 10, 2, 5, 11] array = [{field0: 0}, {field1: 1}, {field2: 2}, ... {field5: 5}, {field6: 6}...]

Так что я попытался с помощью вложенного цикла с сращиванием, но потом, когда я сращивание, мой массив теряет свою индексацию и винты вверх.

Конечный результат должен выйти, чтобы быть как array = [{field1: 1}, {field3: 3}, {field4: 4}, .... {field6: 6} ...]

Любая помощь будет принята с благодарностью.

+0

Есть ли причина, по которой вы не можете сортировать индексы, прежде чем вытаскивать объекты из массива? –

+0

Нет причин, я могу сортировать, просто хотел посмотреть, будет ли какая-либо разница для отсортированных индексов и не отсортирована. Но давайте просто предположим, что он отсортирован. –

ответ

2

Решение вашей проблемы действительно один лайнер:

array = [00,11,22,33,44,55,66,77]; 
 
indexes = [1,7,5,3]; 
 

 
array = array.filter(function(_,i) { return indexes.indexOf(i) < 0 }); 
 

 
document.write('<pre>'+JSON.stringify(array,0,3));

0

Я бы итерации через массив (для/следующего цикла), и у каждого элемента видят, существует ли число в индексе (index.indexOf (n)). Если это произойдет, нажмите элемент в новый временный массив.

Когда вы закончите, скопируйте массив temp обратно в массив OR array.length = 0 и вытащите элементы из массива temp обратно в исходный массив.

что-то вроде этого:

var index = [ 0, 7, 10, 2, 5, 11] 
var array = [{field0: 0}, {field1: 1}, {field2: 2},{field3: 3}, {field4: 4}]; 
var tempArray = []; 

for(var arrayIndex = 0;arrayIndex < array.length;arrayIndex++){ 
    if(index.indexOf(arrayIndex) === -1) 
    { 
     tempArray.push(array[arrayIndex]); 
    } 
} 
array = tempArray; 
+0

Это только результаты, которые равны индексу. Я хочу наоборот. удаления элементов, находящихся в массиве индексов. Возможно, какой-то быстрый код поможет мне лучше понять вас. Thanks –

+0

OK .. извините. если это не так, нажмите элемент. Я буду работать над некоторым кодом. –

+0

Спасибо, но смог использовать ответ Беннетта. –

1

Если сортировка массива элементов для удаления не является проблемой, вы можете просто сделать следующее:

var array = [{field0: 0}, {field1: 1}, {field2: 2}, {field3: 3}, {field4: 4}, {field5: 5}, {field6: 6}, {field7: 7}, {field8: 8}, {field9: 9}]; 
    var indices = [0, 7, 2, 5]; 

    indices.sort(function(a, b) { 
     if (a > b) { 
      return 1; 
     } else if (b > a) { 
      return -1; 
     } else { 
      return 0; 
     } 
    }); 
    for (var i = 0, offset = 0; i < indices.length; i++, offset++) { 
     array.splice(indices[i] - offset, 1); 
    } 
    console.log(array); 

И если по каким-то причинам вы не смогли для сортировки массива индексов для удаления вы можете отслеживать смещение следующим образом:

var array = [{field0: 0}, {field1: 1}, {field2: 2}, {field3: 3}, {field4: 4}, {field5: 5}, {field6: 6}, {field7: 7}, {field8: 8}, {field9: 9}]; 
    var indices = [0, 7, 2, 5]; 

    var removedIndices = []; 
    function calcOffset(val) { 
     var numRemoved = 0; 
     for (var j = 0; j < removedIndices.length; j++) { 
      if (val > removedIndices[j]) { 
       numRemoved++; 
      } 
     } 
     return numRemoved; 
    } 

    for (var i = 0, offset = 0; i < indices.length; i++, offset++) { 
     var offset = calcOffset(indices[i]); 
     array.splice(indices[i] - offset, 1); 
     removedIndices.push(indices[i]); 
    } 

    console.log(array); 
+0

@ Ответ georg намного лучше, чем этот :) –

+0

Я не решался использовать его, поскольку я знаю, что indexOf и фильтр не в более ранних версиях IE 8 или 9, но ваш выбор lol. –

1

Вы можете попробовать удалить их с удаления массива [индекс [число]] обернув, пока не определено, не является проблема.

Или вы можете установить цикл через все элементы массива и установить любой элемент, индекс которого отсутствует в false. Затем проведите их снова и скопируйте только те, которые не являются ложными для нового массива.

newArray = new Array(); 

for (var i = 0; i < array.length; i++) { 
    for(var j=0; j<index.length; j++) { 
    if (index[j] == i) { 
     array[i] = false; 
    } 
    } 
}; 

for (var i = 0; i < array.length; i++) { 
    if (array[i] != false) { 
     newArray[i] = array[i]; 
    } 
    } 
+0

Это не то, для чего используется ключевое слово delete. –

+0

, но разве это не выполнено? @DaveBush –

+0

не очень, и это не будущее доказательство. Ключевое слово delete удаляет свойства из объектов. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete –

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