Обрезать / удалить значения в массиве по определенным показателям

У меня есть один массив, как так:

peoples = ['dick', 'jane', 'harry', 'debra', 'hank', 'frank' .... ]

И тот, содержащий ключи, например, так:

keys  = [1, 6, 3, 12 .... ]

Теперь я мог бы написать что-то вроде этого:

var peoplesStripedOfKeyPostions = [];

for(i = 0; i < peoples.length; i++){
    for(j = 0; j < keys.length; j++){
        if( i !== keys[j]){
            peoplesStripedOfKeyPostions.push( peoples[i] );
        }
    }        
}

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

Знаете ли вы лучший способ сделать это? (Если я получу несколько рабочих ответов, jsperf определит победителя.)

 Hamish07 сент. 2012 г., 05:52
Кроме того, ключи отсортированы?
 Fresheyeball07 сент. 2012 г., 05:52
Ключи не в определенном порядке
 Fresheyeball07 сент. 2012 г., 05:52
Мне нужна копия с сохранением оригинала.
 ninjagecko07 сент. 2012 г., 05:53
Я полагаю, что вы имеете в виду "раздели" (одежда) не "полосатая" (Зебры)
 Hamish07 сент. 2012 г., 05:51
Вам нужна копия или вы можете удалить элементы изpeoples?

Ответы на вопрос(2)

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

keys.forEach(function(i) { delete people[i]; });

peopleRemaining = Object.keys(people).map(function(i) { return people[i]; });

Обратите внимание, что это изменяет оригиналpeople массив.

 Fresheyeball07 сент. 2012 г., 20:15
Я не думаю, что это сработает, потому что после удаленияpeople[i] показателиpeople сдвиги массивов.
 08 сент. 2012 г., 00:02
Подумайте об этом: вы можете использовать что угодно в качестве индекса массива.count['apple'] = 3; например. Если вы сделалиdelete count['apple']; что бы это значило для «сдвига» остальные записи?
 Fresheyeball07 сент. 2012 г., 20:55
Я не знал этого. Интересно.
 Fresheyeball08 сент. 2012 г., 02:25
хорошо, если бы я использовал что-то вродеcount['apple'] Я не в массиве, я в объекте. И у объектов в javascript нет индексов.count['apple'] действительно динамичный способ записиcount.apple, в то время какcount[4] не может бытьcount.4
 07 сент. 2012 г., 20:42
Удаление индекса массива просто оставляет дыру, потому что индексы массива являются просто свойствами. Если вы хотите сдвинуть, вам нужно использоватьsplice метод.
Решение Вопроса
people.filter(function(x,i){return badIndices.indexOf(i)==-1})

Это станет неэффективным, еслиbadIndices массив большой. Более эффективная (хотя и менее элегантная) версия будет:

var isBadIndex = {};
badIndices.forEach(function(k){isBadIndex[k]=true});

people.filter(function(x,i){return !isBadIndex[i]})

(note: you cannot use a variable named keys because that is a builtin function)

 07 сент. 2012 г., 05:57
Ударь меня к этому ..
 07 сент. 2012 г., 05:58
+1 заfilter(), Обратите внимание, что в IE он не поддерживается & lt; 9.
 07 сент. 2012 г., 05:57
@Fresheyeball: он вернет копиюpeople массив без изменения исходного массива
 Fresheyeball07 сент. 2012 г., 06:47
@ninjagecko Я действительно мог использовать противоположное на самом деле, я попытался просто вернуться кreturn badIndices.indexOf(i) !== -1 но как ни странно, он достиг того же списка.
 Fresheyeball07 сент. 2012 г., 05:56
это изменитpeoples или вернуть значение, с которого я могу установить копию?

Ваш ответ на вопрос