Удалить невыбранные элементы из массива - PullRequest
1 голос
/ 18 марта 2020

Я разработал раскрывающийся список автозаполнения.

Когда я выбираю пользователей, я сохраняю идентификаторы в массиве пользователей.

Когда я выбираю пользователя, он добавляется в массив, но когда не выбран пользователь, есть ли способ удалить его из массива? Как я могу это сделать?

Есть ли способ конвертировать массив в строку, чтобы вывести строку, например: «1,2»?

Спасибо

Stackblitz - демо

.ts

users:any [] =[];
 itemSelectionChanged(e){
   console.log("item",e)
   if(e.itemData.selected == true){
     this.users.push(e.itemData.ID);
     console.log(this.users)

     //output as a string and not an array.... like "1,2"
   }
   else{
     //Remove the unselected value in the array this.users e.itemData.ID
   }
 }

. html

<dx-drop-down-box [(value)]="treeBoxValue" valueExpr="ID" displayExpr="name" placeholder="Select a value..."
    [showClearButton]="true" [dataSource]="treeDataSource" (onValueChanged)="syncTreeViewSelection()">
    <div *dxTemplate="let data of 'content'">
        <dx-tree-view [dataSource]="treeDataSource" dataStructure="plain" selectionMode="multiple"
            showCheckBoxesMode="normal" [selectNodesRecursive]="false" displayExpr="name" [searchEnabled]="true"
            [selectByClick]="true" (onItemSelectionChanged)="itemSelectionChanged($event)">
        </dx-tree-view>
    </div>
</dx-drop-down-box>

image

Ответы [ 4 ]

0 голосов
/ 18 марта 2020

В дополнение к filter() вы также можете использовать splice() с indexOf() для удаления элементов из массива. Включите следующее в else блок

const index = this.users.indexOf(e.itemData.ID, 0);
if (index > -1) {
  this.users.splice(index, 1);
}

Я расширил Stackblitz .

Разница между filter() и splice() в то время как filter() возвращает новый массив, splice() изменяет массив на месте. Поэтому, если вы используете filter(), ему необходимо присвоить обратно переменной, например this.users = this.users.filter(...), тогда как splice() не требует обратного присваивания.

0 голосов
/ 18 марта 2020

Вы можете использовать Array.prototype.filter, чтобы удалить элемент из массива. Вы можете использовать Array.prototype.join для объединения элементов массива с разделителем, таким как запятая:

  itemSelectionChanged(e) {
    // Use object destructure to get property `ID`
    const { ID } = e.itemData;
    if (e.itemData.selected) {
      // Check if element is in array so a duplicate is not added
      // Note: this only works with primitive values, not objects
      if (this.users.indexOf(ID) < 0) {
        this.users.push(ID);
      }

      // Join array items with comma character
      console.log(this.users.join(","));
    } else {
      // Remove items using filter
      this.users = this.users.filter(user => user !== ID);
    }
  }

Вот пример в действии.

0 голосов
/ 18 марта 2020

Вы можете использовать функцию массива splice для удаления элемента из вашего массива. См. Код ниже.

itemSelectionChanged(e) {
    console.log("item",e)
    if(e.itemData.selected == true){
        this.users.push(e.itemData.ID);
        console.log(this.users.join());
        //output as a string and not an array.... like "1,2"
    } else {
        const indexOfRemovedElementID = this.users.indexOf(e.itemData.ID);
        this.users.splice(indexOfRemovedElementID, 1);
        console.log(this.users.join());
        //Remove the unselected value in the array this.users e.itemData.ID
    }
}
0 голосов
/ 18 марта 2020

Попробуйте следующий код, скопируйте в оператор else this.users=this.users.filter(x=>x!=e.itemData.ID);

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