2016-03-27 3 views
-1

У меня есть цикл foreach, где я создаю новый массив temp, а затем запускаю вложенный цикл foreach. Затем я пытаюсь получить доступ к массиву temp внутри вложенного цикла foreach, но он возвращается с ошибкой «переменная недоступна».Тип указателя foreach недоступен

let final = { 
    array: [] 
}; 

myArray.forEach(item => 
{ 
    let newObject = { items: [] }; 

    item.subArray.forEach(subItem => 
    { 
     var subObject = { prop: subItem.prop }; 

     // Error here: "newObject is not available" 
     newObject.items.push(subObject); 
    }); 

    // Error here: "final is not available" 
    final.array.push(newObject); 
}); 

Я знаю, что могу предоставить this в массив, предоставляя его в качестве аргумента (например: item.subArray.forEach(subItem => {},this);)

, но это не помогает мне, потому что tempArray не существует на класса.

У меня такая же проблема, когда я пытаюсь назначить массив темпа «окончательному» массиву, объявленному вне foreach.

Есть ли способ получить доступ к родительскому объекту изнутри foreach?

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

Скриншот показывает вопрос: http://i.imgur.com/HWCz0Ed.png
(код виден на изображении находится в пределах первого forEach цикла)


Обновление: Я понял, что это проблема между использованием let и var. Подробнее см. Мой ответ ниже.

ответ

0

Обновление: Я, наконец, понял это. В моем фактическом коде я создавал newObject, используя ключевое слово let для TypeScript. Вместо этого я заменил его на var, и он начал работать.

Мел, который до меня не понимает разницу между let (объем блока) и var (глобальный объем) - d'oh!

Решение, перечисленное ниже, также работало для меня, но простое изменение let на var означало, что мой оригинальный код работает отлично.


Я решил эту проблему с помощью map() вместо forEach():

var final = { 
    array: [] 
}; 

var finalArray = myArray.map(function (item) 
{ 
    let newObject = { items: [] }; 

    var tempArray = item.subArray.map(function (subItem) 
    { 
     var subObject = { prop: subItem.prop }; 
     return subObject; 
    }); 

    newObject.items = tempArray; 

    return newObject; 
}); 

final.array = finalArray; 
+1

это не делает то же самое первым. код в вашем сообщении будет хранить только последнее сопоставление. –

+0

@TamasHegedus Да, справедливая точка. Я на самом деле использовал неправильный код в вопросе, я обновлю их как –

0

Код, который вы вставили в этот вопрос не должен быть ваш реальный код. если бы у вас не было проблем с доступом к finalArray.

Результаты обоих ваших фрагментов очень разные.

первый даст вам массив всех свойств подпункта последнего элемента.

секунда даст вам массив массивов, где каждый массив содержит свойство элемента

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

Как насчет этого?

var items = [ 
    {subitems:[ 
     {prop:1}, 
     {prop:2}, 
    ]}, 
     {subitems:[ 
     {prop:3}, 
     {prop:4}, 
    ]}, 
] 

var result = items.map(function(item){ 
    return item.subitems.map(function(subitem){ 
     return subitem.prop; 
    }) 
}).reduce(function(prev,curr){ 
    return prev.concat(curr); 
},[]); 

console.log(result); 
+0

Вы правы, код - это упрощенная версия моего фактического кода. В моем фактическом коде я перебираю массив и создаю новый объект для каждого элемента в подмассиве и добавляем его в новый массив. Я просто не могу понять, почему я не могу получить доступ к переменной tempArray внутри foreach. Я предположил, что это была причуда TypeScript –

+0

, так что у вас есть два вопроса, один из них касается области переменных, и для этого мне нужна крупная фотография для посмотрите, почему finalArray выходит за рамки. Во-вторых, как карта, а затем сгладить. и я думаю, что я ответил. – user1852503

+0

Извините, я это неправильно сформулировал - проблема с областью переменной - моя единственная проблема здесь :) Я обновил свой вопрос, чтобы быть более точным в моем случае использования. Вот скриншот * (извините!) *, Показывающий проблему http://i.imgur.com/HWCz0Ed.png Код, который вы видите, находится в первом цикле 'forEach'. –

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