2016-01-27 1 views
2

Я пытаюсь пройти через разреженный массив и заполнить разреженные элементы значением.Javascript - Loop через разреженный массив и заменять разреженные значения

['foo', 'bar', , , ,].map(el => el || 'default') // возвращает ["foo", "bar", undefined × 3]

Как бы я вернуться ["foo", "bar", "default", "default", "default", "default"]

+2

От [MDN] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/ map). «map» вызывает предоставленную функцию обратного вызова один раз для каждого элемента массива в порядке и строит новый массив из результатов. callback вызывается только для индексов массива, которым присвоены значения; ** он не вызывается для индексов, которые были удалены или которые никогда не были назначены значения **. « – pawel

+0

@pawel. Хотя обратный вызов не вызывается для этих индексов, возвращаемое значение из' map() 'все еще имеет эти позиции –

+0

@TedHopp, но они не изменились, что скорее поражает точку для OP – Alnitak

ответ

3

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

for (var i = 0, n = a.length; i < n; ++i) { 
    if (!(i in a)) {  // explicit check for missing sparse value 
     a[i] = "default"; 
    } 
} 
+0

Это будет короткий «default», но я не думаю, что это возможно. –

+0

Для точки @RickHitchcock, похоже, что все эти ответы будут короткими по умолчанию. – Blexy

+0

@RickHitchcock ах, не заметил, что у ОП есть еще один «дефолт», чем элементы, - возможно, это была ошибка? – Alnitak

2

Просто используйте для цикла:

for (i = 0; i < arr.length; i++) { 
    if (arr[i] === undefined) 
    arr[i] = 'default' 
} 
+1

это неверно - оно не просто заменяет разреженные значения, оно заменяет любое значение false. – Alnitak

+1

помните, что код OP имеет этот недостаток ... – Alnitak

+1

@ Алнитак, хороший момент об изъянах. – Blexy

1

Это следует сделать это:

function Fill(n, _default) { 
    return Array.apply(null,n).map(function(val) { 
    return val || _default; 
    }); 
} 
var newa = Fill(myarray, "default"); 
console.log(JSON.stringify(newa)); 

Показано работать здесь: https://jsfiddle.net/6vqsztxg/

+0

@ Алнитак Вы уверены? Попробуйте 'Array.apply (null, [,,,]). Map (i => typeof i)', должен возвращать '[" undefined "," undefined "," undefined "]'. – pawel

+0

ОК, это работает, но это своего рода kludgy, поскольку он заменяет неявные 'undefined' разреженные записи явными' undefined' элементами, а _then_ заменяет найденное значение false. – Alnitak

+0

@pawel Я удалил этот комментарий, когда понял, что мой тест был неправильным – Alnitak