Typescript: печать ключей / значений объектов, содержащих массивы (не forEach) - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь извлечь значения из объекта, который содержит массивы. Вот как выглядит объект:

export const myBookList: Row[] =
[
    {
        bookInfo: [
            {
                title: "The jungle book",   
                isbn: "42398486965239671234",
                Author: "Rudyard Kipling"
            },
            {
                title: "20,000 Leagues Under the Sea",
                isbn: "42234486234239675678",
                Author: "Jules Verne"
            },
            {
                title: "The Call of the Wild",
                isbn: "4239848696523967670",
                Author: "Jack London"
            }
        ],
        value: [],
        id: 0
    },
    {
        bookInfo: [
            {
                title: "The jungle book 2",   
                isbn: "327865923874659276",
                Author: "Rudyard Kipling"
            },
            {
                title: "20,000 Leagues Under the Sea 2",
                isbn: "269587649587264675",
                Author: "Jules Verne"
            },
            {
                title: "The Call of the Wild",
                isbn: "2378687827584758765",
                Author: "Rudyard Kipling"
            }
        ],
        value: [],
        id: 1
    }
];

Я бы хотел go просмотреть все ключи и значения объекта (особенно ключи / значения в массиве bookInfo) и когда ключ соответствует переданный строковый параметр "myKey" найден, я хотел бы вернуть значение ключа. Приведенный ниже код работает нормально, но поскольку записей в myBookList больше, чем один ... когда я обнаружил, что я соответствую, я не могу выйти из процедуры из-за каждой итерации (forEach в машинописи не принимает break или return) и я всегда получаю последние записи объекта. Как это решить?

getValue(data: Row, myKey: string): string {
let retValue: string = "";
data.forEach(function(item) {
    item.bookInfo.forEach(function(key, index){
        console.log(key, index);
        if (key===myKey) {
            console.log(key, index);
            ret=key.value;
        }

     });
});
return retValue;

}

1 Ответ

0 голосов
/ 15 января 2020

Вы можете использовать while l oop. Когда вы удовлетворяете условию, тогда мы можем использовать оператор return для получения желаемых значений:

const getValue = (data, myKey) => {
  let i = 0;

  while (data.length > i) {
      let bookInfoIndex = data[i].bookInfo
                                 .findIndex(f => Object.keys(f).includes(myKey));
      if (bookInfoIndex != -1)
        return data[i].bookInfo[bookInfoIndex][myKey];

      i++;
  }
}

Пример:

let arr = [{bookInfo: [{title: "The jungle book",isbn: "42398486965239671234",Author: "Rudyard Kipling"}, {title: "20,000 Leagues Under the Sea",isbn: "42234486234239675678",Author: "Jules Verne"      },{title: "The Call of the Wild",isbn: "4239848696523967670",Author: "Jack London"}],  value: [],    id: 0  },
  { bookInfo: [{title: "The jungle book 2",isbn: "327865923874659276",Author: "Rudyard Kipling" },   {title: "20,000 Leagues Under the Sea 2",isbn: "269587649587264675",Author: "Jules Verne"}, {title: "The Call of the Wild",isbn: "2378687827584758765",Author: "Rudyard Kipling"}], value: [], id: 1 }];

const getValue = (data, myKey) => {
  let i = 0;

  while (data.length > i) {
      let bookInfoIndex = data[i].bookInfo.findIndex(f => Object.keys(f).includes(myKey));
      if (bookInfoIndex != -1)
        return data[i].bookInfo[bookInfoIndex][myKey];

      i++;
  }
}

console.log(getValue(arr, 'title'));
...