ウェブサイト検索

TypeScript - Cheerioオブジェクトを「ネイティブ」オブジェクトの配列にマッピングする


私は次のHTMLを持っています(異なるデータで数回繰り返されています)、これはcheerioを使って読み込んだドキュメント内にあります:

<li class="wprm-recipe-ingredient">
  <span class="wprm-recipe-ingredient-amount">1</span>
  <span class="wprm-recipe-ingredient-unit">pound</span>
  <span class="wprm-recipe-ingredient-name">extra lean ground beef</span>
</li>

これは私が意図を表現するために書いたコードです:

const $ingredients = $("li[class='wprm-recipe-ingredient']");

const ingredients = $ingredients.map((_idx, $e) => {
    const $elem = $($e);
    const amount = $elem.children('[class$="-amount"]').text();
    const unit = $elem.children('[class$="-unit"]').text();
    const name = $elem.children('[class$="-name"]').text();
    return { amount, unit, name };
}); // => [{amount, unit, name}, { ... }]

しかしそのコメントは、私が実際に得るものではなく、私が望むものを示している。

実際の型は const ingredients: Cheerio であり、私が作ろうとした形の匿名オブジェクトの配列ではありません。

$ingredients を次の形にマッピングするにはどうすればよいですか?

[{ amount: '1', unit: 'pound', name: 'extra lean ground beef' }]

Cheerioの.get()はstring[]またはCheerioElement[]のいずれかを返すことに注意してください。私が見る限り、それは私が欲しいものではありません。

編集:

これについてもう少し詳しく説明すべきだ。

私が現在行っているのは、最初に配列を作成し、その後 $ingredients.forEach(...) クロージャの最後でその配列に push することです。

回答 #1

反復可能なオブジェクトを従来の配列に展開し、その上でネイティブの .map を使います:

const cheerio = require("cheerio"); // 1.0.0-rc.12

const html = `
<li class="wprm-recipe-ingredient">
  <span class="wprm-recipe-ingredient-amount">1</span>
  <span class="wprm-recipe-ingredient-unit">pound</span>
  <span class="wprm-recipe-ingredient-name">extra lean ground beef</span>
</li>
`;

const $ = cheerio.load(html);
const result = [...$(".wprm-recipe-ingredient")].map(e => ({
  amount: $(e).find(".wprm-recipe-ingredient-amount").text(),
  unit: $(e).find(".wprm-recipe-ingredient-unit").text(),
  name: $(e).find(".wprm-recipe-ingredient-name").text(),
}));
console.log(result);

これにより:

[ { amount: '1', unit: 'pound', name: 'extra lean ground beef' } ]