Typescript - проверка значений в одном массиве присутствуют в другом - PullRequest
1 голос
/ 25 февраля 2020

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

  accessLevels: any = [
    {
      description: "Properties",
      type: '1',
      selected: false
    },
    {
      description: "Equipment",
      type: '2',
      selected: false
    },
    {
      description: "Jobs",
      type: '3',
      selected: false
    },
    {
      description: "Calender",
      type: '4',
      selected: false
    }
]

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

    {
      description: "Equipment",
      type: '2'
    },
    {
      description: "Jobs",
      type: '3'
    }

В массиве, возвращенном из API, я просто получаю значения, которые должны появиться, отмечены флажками, так что я я хочу сделать l oop через возвращенный массив и проверить, совпадает ли какой-либо из типов с какими-либо типами в массиве флажков, если я хочу, чтобы для 'selected' было установлено значение true. Таким образом, проверяя флажок.

Вот что у меня пока есть:


  async loadLandlordConfig(key: string) {

    const result = await this.userService.loadLandlordConfig(key);

    //let accessLevels = [];

    this.selectedApiValues = result[0].accessLevels;

    this.selectedApiValues.forEach((selectedValue)=> {

    });
  }

Я не уверен, как перепроверить значения и затем изменить выбранное на true.

Надеюсь, я все прояснил. Любые вопросы, пожалуйста, задавайте. Вся помощь оценена.

Ответы [ 5 ]

2 голосов
/ 25 февраля 2020
  const accessLevels: any[] = [
    {
      description: 'Properties',
      type: '1',
      selected: false
    },
    {
      description: 'Equipment',
      type: '2',
      selected: false
    },
    {
      description: 'Jobs',
      type: '3',
      selected: false
    },
    {
      description: 'Calender',
      type: '4',
      selected: false
    }];

  const results: any[] = [
    {
      description: 'Equipment',
      type: '2'
    },
    {
      description: 'Jobs',
      type: '3'
    }];

  accessLevels.forEach(accessLevel => {
    accessLevel.selected = results.some(x => x.type === accessLevel.type); });
2 голосов
/ 25 февраля 2020

Для маленьких массивов

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

const intersect = this.array1.filter(a1 => 
  this.array2.some(a2 => a1.type === a2.type));

Проблема в том, что вы делаете несколько циклов в массиве 2.

Для больших массивов

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

const map2 = new Map(this.array2.map(x => [x.type, s]));
const intersect = this.array1.filter(a1 => 
  map.has(a1.type));

Это добавляет немного сложности, но более эффективно для всех, кроме самых простых случаев.

2 голосов
/ 25 февраля 2020

Вы можете достичь желаемого с помощью следующего простого примера:

let accessLevels = [
    {
      description: "Properties",
      type: '1',
      selected: false
    },
    {
      description: "Equipment",
      type: '2',
      selected: false
    },
    {
      description: "Jobs",
      type: '3',
      selected: false
    },
    {
      description: "Calender",
      value: '4',
      selected: false
    }
]

let api = [
    {
      description: "Equipment",
      type: '2'
    },
    {
      description: "Jobs",
      value: '3'
    }
];

for(var i = 0; i < accessLevels.length; i++) {
     accessLevels[i].selected = api.find(e => e.description === accessLevels[i].description) ? true : false;
}

console.log(accessLevels);
0 голосов
/ 25 февраля 2020

Я сделал некоторые изменения в вашем коде. Вот как это выглядит:

async loadLandlordConfig(key: string) {

    const result = await this.userService.loadLandlordConfig(key);

    // assuming there's always a result.
    // ACCESS_LEVELS is the list of your config.
    accessLevels = result[0].accessLevels;
    this.selectedApiValues = ACCESS_LEVELS.map((al: any) => {
      const selected = accessLevels.findIndex(a => a.type === al.type) > -1;
      return { ...al, selected }
    })
  }

Это даст вам значение

this.selectedApiValues = [
  {
      description: "Properties",
      type: '1',
      selected: false
    },
    {
      description: "Equipment",
      type: '2',
      selected: true
    },
    {
      description: "Jobs",
      type: '3',
      selected: true
    },
    {
      description: "Calender",
      type: '4',
      selected: false
    }
]
0 голосов
/ 25 февраля 2020

Вы можете использовать Map collection, чтобы иметь O(1) при отображении второго массива:

const unique = new Map(received.map(s => [s.description, s]));
const result = accessLevels.map(({ description, type})=> 
    ({selected: (unique.get(description) ? true : false), type, description}))

Пример:

let accessLevels = [
  {
    description: "Properties",
    type: '1',
    selected: false
  },
  {
    description: "Equipment",
    type: '2',
    selected: false
  },
  {
    description: "Jobs",
    type: '3',
    selected: false
  },
  {
    description: "Calender",
    type: '4',
    selected: false
  }
]

const received = [
  {
  description: "Equipment",
  type: '2'
  },
  {
    description: "Jobs",
    value: '3'
  }
];

const unique = new Map(received.map(s => [s.description, s]));
const result = accessLevels.map(({ description, type})=> 
    ({selected: (unique.get(description) ? true : false), type, description}))
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...