Получить элемент другим элементом из списка в TypeScript - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь выяснить, в Type Script как получить один элемент из this.myList другим элементом.Если я добавлю элементы к private myList: any = []; таким образом:

  this.myList.push({ id: i, name: myName, UID: obj.UID },);

, где id: i - это номер итерации цикла, name: myName - это имя пользователя, а UID: obj.UID - это непоследовательный номер, тогда *Содержание 1010 * выглядит примерно так:

    id| myName   | UID
    -------------------
    0 | sally    | 345
    1 | vikram   | 5487
    2 | kim      | 12
    3 | roy      | 2134

Моя цель и желаемый результат - найти значение ID: obj.ID по myName.Например, получить UID значение: 12 от myName: ким

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

 let a = [{id: 0, name: 'sally', uid: 345}, {id: 1, name: 'vikram', uid: 5487}, {id: 2, name: 'kim', uid: 12}, {id: 3, name: 'roy', uid: 2134}];
 let wantedname = 'kim';
 let found = a.find(e => e.name === wantedname);
 found.uid;

но если я пытаюсь использовать его со своим реальным списком, я получаю ERROR TypeError: Cannot read property 'uid' of undefined:

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

 val srcVal = ' ' + this.searchName; 

или даже без пробела:

 val srcVal = this.searchName; 

 let found = this.myList.find(e => e.name === srcVal);

или:

  let a = this.myList;
  let found = a.find(e => e.name === srcVal);

В console.log("Name: " + this.searchName, " UID: ", found.uid ); found.uid равно undefined.

Это та же структура, не уверен, что с ней не так

1 Ответ

0 голосов
/ 26 июня 2018

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

findByName(searchName: string) {
    const found = this.myList.find(({ name }) => searchName === name);

    if (found) {
        return found.uid;
    } else {
        return null;
    }
}

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

Например:

// Type of myList
myList: {[name: string]: { id: number, name: string, uid: string }} = {};

// Adding a new object
this.myList[myName] = { id: i, name: myName, uid: obj.UID };

// The new findByName implementation
findByName(searchName: string) {
    const found = this.myList[searchName];

    if (found) {
        return found.uid;
    } else {
        return null;
    }
}

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

...