'How to use ":nth-child()" in a loop with complex querySelector()

Extracting data into a single array with querySelector works:

var don1 = [];
var don2 = [];
var don3 = [];
var num = 3;

function getData(num) {

  for (i = 1; i < num + 1; i++) {

    let y = eval("don" + i.toString());
    console.log("checkpoint " + i + ": y = " + y);

    y[0] = document.querySelector(
      "[data-dynamic='project.ProjectCode']"
    ).innerHTML.replace(/\s/g, "");

    y[1] = document.querySelector(
      "[data-react-component-name='DonationAmount'] input[type='text']"
    ).value;

    y[2] = document.querySelector(
      "[data-react-component-name='Frequency'] > select"
    ).options[
      document.querySelector(
        "[data-react-component-name='Frequency'] > select"
      ).selectedIndex
    ].text;
    console.log("checkpoint " + i + ": y = " + y);
  }
}
<button class="button1" onclick="getData(3)" type="button"> getData </button>

<p id="demo">0</p>

<div data-component="cart.populated">
  <div data-component="cart.populated.project">
    <div class="row">

      <label>
        PROJ 1
      </label>
      <br>
      <label>
        Donation Amount:
      </label>

      <span data-react-component-name="DonationAmount">
        <input type="text" value="$50.00" maxlength="10">
      </span>

      <span data-react-component-name="Frequency">
        <select>
          <option value="O">One Time</option>
          <option value="M">Monthly</option>
        </select>
      </span>

      <label data-dynamic="project.ProjectCode">
        101
      </label>
    </div>
    <div class="row">

      <label>
        Erica
      </label>
      <br>
      <label>
        Donation Amount:
      </label>

      <span data-react-component-name="DonationAmount">
        <input type="text" value="$20.00" maxlength="10">
      </span>

      <span data-react-component-name="Frequency">
        <select>
          <option value="O">One Time</option>
          <option value="M">Monthly</option>
        </select>
      </span>

      <label data-dynamic="project.ProjectCode">
        102
      </label>
    </div>
    <div class="row">

      <label>
        Allison
      </label>
      <br>
      <label>
        Donation Amount:
      </label>

      <span data-react-component-name="DonationAmount">
        <input type="text" value="$10.00" maxlength="10">
      </span>

      <span data-react-component-name="Frequency">
        <select>
          <option value="O">One Time</option>
          <option value="M">Monthly</option>
        </select>
      </span>

      <label data-dynamic="project.ProjectCode">
        103
      </label>
    </div>
  </div>
</div>

Extracting data into multiple arrays using :nth-child doesn't seem to work:

var don1 = [];
var don2 = [];
var don3 = [];
var num = 3;

function getData(num) {

  for (i = 1; i < num + 1; i++) {

    let y = eval("don" + i.toString());
    console.log("checkpoint " + i + ": y = " + y);

    y[0] = document
      .querySelector("[data-dynamic='project.ProjectCode']:nth-child(" + i + ")")
      .innerHTML.replace(/\s/g, "");

    y[1] = document.querySelector(
      "[data-react-component-name='DonationAmount'] input[type='text']:nth-child(" + i + ")").value;

    y[2] = document.querySelector(
      "[data-react-component-name='Frequency'] > select:nth-child(" + i + ")").options[
      document.querySelector(
        "[data-react-component-name='Frequency'] > select:nth-child(" + i + ")").selectedIndex
    ].text;
    console.log("checkpoint " + i + ": y = " + y);
  }
}
<button class="button1" onclick="getData(3)" type="button"> getData </button>

<p id="demo">0</p>

<div data-component="cart.populated">
  <div data-component="cart.populated.project">
    <div class="row">

      <label>
        PROJ 1
      </label>
      <br>
      <label>
        Donation Amount:
      </label>

      <span data-react-component-name="DonationAmount">
        <input type="text" value="$50.00" maxlength="10">
      </span>

      <span data-react-component-name="Frequency">
        <select>
          <option value="O">One Time</option>
          <option value="M">Monthly</option>
        </select>
      </span>

      <label data-dynamic="project.ProjectCode">
        101
      </label>
    </div>
    <div class="row">

      <label>
        Erica
      </label>
      <br>
      <label>
        Donation Amount:
      </label>

      <span data-react-component-name="DonationAmount">
        <input type="text" value="$20.00" maxlength="10">
      </span>

      <span data-react-component-name="Frequency">
        <select>
          <option value="O">One Time</option>
          <option value="M">Monthly</option>
        </select>
      </span>

      <label data-dynamic="project.ProjectCode">
        102
      </label>
    </div>
    <div class="row">

      <label>
        Allison
      </label>
      <br>
      <label>
        Donation Amount:
      </label>

      <span data-react-component-name="DonationAmount">
        <input type="text" value="$10.00" maxlength="10">
      </span>

      <span data-react-component-name="Frequency">
        <select>
          <option value="O">One Time</option>
          <option value="M">Monthly</option>
        </select>
      </span>

      <label data-dynamic="project.ProjectCode">
        103
      </label>
    </div>
  </div>
</div>


Solution 1:[1]

[NOT FINISHED] This is what I've got working so far, have to head out but will fix it up more later:

var don1 = [];
var don2 = [];
var don3 = [];
var num = 3;

function getData(num) {

  for (i = 1; i < num + 1; i++) {

    let y = eval("don" + i.toString());
    console.log("checkpoint " + i + ": y = " + y);

    y[0] = document
      .querySelector(`[data-component='cart.populated.project']:nth-child(${i}) [data-dynamic='project.ProjectCode']`)
      .innerHTML.replace(/\s/g, "");

    y[1] = document.querySelector(
      `[data-component='cart.populated.project']:nth-child(${i}) [data-react-component-name='DonationAmount'] input[type='text']`).value;

    y[2] = document.querySelector(
      `[data-component='cart.populated.project']:nth-child(${i}) [data-react-component-name='Frequency'] > select`).options[
      document.querySelector(
        `[data-component='cart.populated.project']:nth-child(${i}) [data-react-component-name='Frequency'] > select`).selectedIndex
    ].text;
    console.log("checkpoint " + i + ": y = " + y);
  }
}
<button class="button1" onclick="getData(3)" type="button"> getData </button>

<p id="demo">0</p>

<div data-component="cart.populated">
  <div data-component="cart.populated.project">
    <div class="row">

      <label>
        PROJ 1
      </label>
      <br>
      <label>
        Donation Amount:
      </label>

      <span data-react-component-name="DonationAmount">
        <input type="text" value="$50.00" maxlength="10">
      </span>

      <span data-react-component-name="Frequency">
        <select>
          <option value="O">One Time</option>
          <option value="M">Monthly</option>
        </select>
      </span>

      <label data-dynamic="project.ProjectCode">
        101
      </label>
    </div>
    <div class="row">

      <label>
        Erica
      </label>
      <br>
      <label>
        Donation Amount:
      </label>

      <span data-react-component-name="DonationAmount">
        <input type="text" value="$20.00" maxlength="10">
      </span>

      <span data-react-component-name="Frequency">
        <select>
          <option value="O">One Time</option>
          <option value="M">Monthly</option>
        </select>
      </span>

      <label data-dynamic="project.ProjectCode">
        102
      </label>
    </div>
    <div class="row">

      <label>
        Allison
      </label>
      <br>
      <label>
        Donation Amount:
      </label>

      <span data-react-component-name="DonationAmount">
        <input type="text" value="$10.00" maxlength="10">
      </span>

      <span data-react-component-name="Frequency">
        <select>
          <option value="O">One Time</option>
          <option value="M">Monthly</option>
        </select>
      </span>

      <label data-dynamic="project.ProjectCode">
        103
      </label>
    </div>
  </div>
</div>

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Zach Jensz