Конвертировать два forEach в карту - PullRequest
0 голосов
/ 17 декабря 2018

Как преобразовать эти два цикла forEach в функцию карты?

var storedNames = [1,2,3];
var mod = {id: 3, blocList: [{id:11}, {id:12}]};

storedNames.forEach((item: number) => {
  if (item === mod.id) {
    mod.blocList.forEach((bloc: Bloc) => {
      storedNames.push(bloc.id);
    });
  }
});

Результат будет: storedNames = [1, 2, 3, 11, 12]

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Это будет работать, но это не идеальное использование Array.map().В идеале вы должны использовать карту, если хотите сохранить целые имена в сохраненном виде и создать ее копию с изменениями, которые делает цикл.Например:

modifiedStoredNames = storedNames.map(//do stuff);

Насколько я понимаю, map - это способ сделать копию массива с изменениями, примененными к каждому элементу, используя функцию, переданную в качестве параметра.В этом случае мы просто используем map() для цикла (два цикла, если быть точным) и обновляем массив storedNames на основе условия в этом цикле. И игнорирование того, что на самом деле возвращает карта.

storedNames.map((item: number) => {
  if (item === mod.id) {
    mod.blocList.map((bloc: any) => {
      storedNames.push(bloc.id);
    })
  }
})
0 голосов
/ 17 декабря 2018

Вы можете использовать map в сочетании с синтаксисом расширения, например:

var storedNames = [1,2,3];
var mod = {id: 3, blocList: [{id:11}, {id:12}]};

if (storedNames.some(item => item == mod.id)) {
    storedNames.push(...mod.blocList.map(bloc => bloc.id));
}

console.log(storedNames);
0 голосов
/ 17 декабря 2018

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

Если у вас есть больше данных в разных формах, то в этом случае вам нужно будет изменить код на основе вашего целевого результата.

Примечание: Здесь вы используете Typescript, и мой ответ на чистом JavaScript (Node.js), поэтому, пожалуйста, не забудьте указать тип переменных в список параметров или инициализация операторы типа function(item){...} до function(item: number){...} и т. д.

var storedNames = [1,2,3];
var mod = {id: 3, blocList: [{id:11}, {id:12}]};

var storedNames = storedNames.map(function(item) {
    if(item === mod.id) {
        var bArr = [item]; // [3]
        var cArr = mod.blocList.map((bloc) => {
            return(bloc.id); // Returning 11 and 12 one after one
        });

        bArr = bArr.concat(cArr);
        // console.log(cArr); /* [ 11, 12 ] */
        // console.log(bArr); /* [ 3, 11, 12 ] */
        return bArr;
    }
    return item; // Returning 1 and 2 one after one
}) 

console.log(storedNames);  // [ 1, 2, [ 3, 11, 12 ] ]

//Finally
storedNames = storedNames.concat(storedNames.splice(storedNames.length - 1, 1)[0]); 

console.log(storedNames); // [ 1, 2, 3, 11, 12 ]
0 голосов
/ 17 декабря 2018

Вы можете использовать array#map и array#concat для генерации нужного массива.

var storedNames = [1,2,3],
    mod = {id: 3, blocList: [{id:11}, {id:12}]},
    result = [...storedNames].concat(mod.blocList.map(({id}) => id));
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...