2015-07-18 5 views
0
var a = ['a', 'b', 'c']; 
var b = ['d', 'e', 'f']; 
var c = ['g', 'h', 'i']; 
var d = [a, b, c]; 
for (e in d) var f = d.concat(e); 
console.log(f); //[Array[3], Array[3], Array[3], "2"] 

Почему есть в там ? Как удалить это , прежде чем результат получится? (не изменять результат)Почему есть общий индекс числа массивов в результате Concat

+0

Что вы пытаетесь сделать? Какова цель? – nikhil

+0

Целью является знание, поскольку https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in заявлено, что лучше использовать 'for .. in' для объектов, так что я сделал, и я не ожидаю результата, потому что я не дал никакого значения «2» где-нибудь –

ответ

2

"2" - свойство length полученного массива. Он включен, потому что вы используете for ... in. Если вы используете for (var i=0; i<d.length; i++) {...}, он не будет включен. См. Фрагмент. Во всяком случае, мне кажется, что вы можете упростить всю энчилладу, используя var f = d.slice().

Приводя MDN:

Массив индексов только ПЕРЕЧИСЛИМЫЕ свойства с целыми именами и в остальном идентичны общим свойствам объектов. Нет никакой гарантии, что для ... in вернет индексы в любом конкретном порядке и вернет все перечислимые свойства, в том числе с нецелочисленными именами и наследуемыми.
Поскольку порядок итераций зависит от реализации, итерация по массиву может не посещать элементы в последовательном порядке. Поэтому лучше использовать цикл for с числовым индексом (или Array.prototype.forEach() или цикл for ...) при итерации по массивам, где важна последовательность доступа.

See also ...

var a = ['a', 'b', 'c']; 
 
var b = ['d', 'e', 'f']; 
 
var c = ['g', 'h', 'i']; 
 
var d = [a, b, c]; 
 
var f = []; 
 
for (var i=0; i < d.length; i+=1) { 
 
    f.push(d[i]); 
 
} 
 
document.querySelector("#result").textContent = JSON.stringify(f, null, " ");
<pre id="result"></pre>

+0

Означает ли это, что «для ... в» плохо для итерации? что отличает его от 'for (...)'? –

+0

@JigongBagong: см. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in – KooiInc

+0

@JigongBagong Вот еще одно отличное объяснение, объясняющее это. и многое другое ... [Enumerability_and_ownership_of_properties] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties) – cswl

0

Это из-за вашу работу Concat, здесь й индекс элемента в массиве д, Попробуйте этот код вы получите представление

var a = ['a', 'b', 'c']; 
var b = ['d', 'e', 'f']; 
var c = ['g', 'h', 'i']; 
var d = [a, b, c]; 
var f ; 
for (e in d){ 
    console.log(e); 
    f = d.concat(e); 
    console.log(f); 
} 
console.log(f); //[Array[3], Array[3], Array[3], "2"] 

Еще не cl что вы ожидаете.


Редактировать 1 Ожидаемое выход d массива. Поскольку вы уже определили два размерных массива d, имеющих все вышеперечисленное, нет необходимости его конкретизировать.

console.log(d); 

Edit 2 Если вы что скопировать массив, используя этот код там wayaround

var a = ['a', 'b', 'c']; 
var b = ['d', 'e', 'f']; 
var c = ['g', 'h', 'i']; 
var d = [a, b, c]; 
var f = []; 
for (e in d){ 
    console.log(e); 
    f[e] = d[e]; 
    console.log(f); 
} 
console.log(f); //[Array[3], Array[3], Array[3]] 

Приведенный выше код будет копировать массив д в массиве е

+0

Я ожидаю '[[Array [3], Array [3], Array [3]]', потому что я не дал значения «2» там –

+0

Очень хорошее объяснение ** Редактировать ** ** Спасибо! –

0

Ну, на основе на других ответах вы теперь знаете, почему «2» в вашем массиве.

Я пытаюсь настроить таргетинг на вашу реальную проблему, и я, возможно, гипотетически, однако, похоже, вы хотите объединить 3 массива.

Если я правильно понимаю, вы можете попробовать

var a = ['a', 'b', 'c']; 
var b = ['d', 'e', 'f']; 
var c = ['g', 'h', 'i']; 
var f = a.concat(b).concat(c); 
console.log(f); // ["a", "b", "c", "d", "e", "f", "g", "h", "i"] 
+0

да пример с 3 массивами, но что, если число массива динамическое через '.push()', поэтому я использую 'for..in' –

+0

Вам просто нужно обновить код, так же, как вы бы сделано для обновления 'var d = [a, b, c];' в случае динамического числа массивов. – nikhil

+1

хорошо, я думал, что смогу сделать это через 'for in' Спасибо за обмен! я весьма признателен –

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