Angular - как проверить, является ли следующее значение обратного вызова заданным c, и что-то сделать в случае, если нет? - PullRequest
0 голосов
/ 21 февраля 2020

Я упросту свой код и покажу вам пример:

У меня есть этот массив объектов:

let myArray = [{month: 1}, {month: 2}, {month: 4}, {month: 6}];

У меня есть функция, используемая для сопоставления значений этого объекта, к другому объекту:

моя функция отображения:

mapFunction(myObj) {
return {newProperty: myObj.month}
}

, затем я вызываю эту функцию внутри map():

let myNewArray = this.myArray.map(mapFunction);

, и это прекрасно работает, она отображает каждое значение myArray использует мою функцию.

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

Итак, в приведенном выше примере следует добавить 2 новых объекта, {month: 3}, {month: 5}, поскольку они отсутствуют, но не следует добавлять месяцы после последнего, только те, которые создают "дыры"

Надеюсь, я прояснил ситуацию.

Моя функция отображения должна проверять, равно ли следующее значение month равному previous + 1, но мы также должны учитывать, что могут быть большие пропуски, например, пропущенные 2 месяцев подряд, и это должно заполнить их обоих!

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Принимая ваши требования, как указано, вы хотите заполнить пробелы в упорядоченном непоследовательном массиве.

Один из способов выполнения сложной карты - использовать функцию массива reduce.

Вы можете добавить исходный массив и передать его в свою функцию отображения:

months = [];

ngOnInit() {
  let myArray = [      
    {month: 20},
    {month: 3}, 
    {month: 4}, 
    {month: 6}
  ];

  myArray = myArray
    .sort((a, b) => a.month - b.month)
    .reduce((arr, current, idx) => {
      const month = current.month;      

      if (idx > 0) {
        const previous = myArray[idx - 1].month + 1;
        for (let i = previous; i < current.month; i++) {
          arr.push({month: i});    
        }   
      }

      arr.push(current);
      return arr;
    }, []);            

  this.months = myArray.map(this.mapFunction);
}

mapFunction(myObj) {
  return {newProperty: myObj.month}
}

DEMO: https://stackblitz.com/edit/angular-hsgdqt

0 голосов
/ 21 февраля 2020

Вы можете создавать и добавлять новые элементы в массив, используя простые l oop:

let myArray = [{month: 1}, {month: 2}, {month: 4}, {month: 6}];
let min = Math.min.apply(Math, myArray.map(o => o.month));
let max = Math.max.apply(Math, myArray.map(o => o.month));

const createArray = (i) => {
  let fooArray = [];
  for (let index = 1; index <= i; index++) {
      fooArray.push({month: index})
  }
  return fooArray;
}

console.log(createArray(max));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...