Можно ли настроить таргетинг / перейти к определенной итерации / циклу и вывести его?

#javascript #arrays

#javascript #массивы

Вопрос:

Следуя моему коду javascript ниже:

 function ready() {
  var items = document.querySelectorAll('.item')
  var data = [];
  for (var i = 0; i < items.length; i  ) { 
    var current = items[i];
    var name = current.getElementsByClassName('item-title')[0].innerText;
    var price = parseInt(current.getElementsByClassName('item-price')[0].innerText);
    var products = {};
    products.title = name;
    products.cost = price;
    data.push(products);
    console.log(data)
 }
 

Я получаю результат ниже:

 [{title: "Jack Daniels 1L", cost: 60}] (1)

[{title: "Jack Daniels 1L", cost: 60}, {title: "Southern Comfort 2L", cost: 130}] (2)

[{title: "Jack Daniels 1L", cost: 60}, {title: "Southern Comfort 2L", cost: 130}, {title: "Golden Label 1L", cost: 120}] (3)

[{title: "Jack Daniels 1L", cost: 60}, {title: "Southern Comfort 2L", cost: 130}, {title: "Golden Label 1L", cost: 120}, {title: "Grey Goose 1L", cost: 31}] (4)

[{title: "Jack Daniels 1L", cost: 60}, {title: "Southern Comfort 2L", cost: 130}, {title: "Golden Label 1L", cost: 120}, {title: "Grey Goose 1L", cost: 31}, {title: "Remy Martins 750ml", cost: 45}] (5)

[{title: "Jack Daniels 1L", cost: 60}, {title: "Southern Comfort 2L", cost: 130}, {title: "Golden Label 1L", cost: 120}, {title: "Grey Goose 1L", cost: 31}, {title: "Remy Martins 750ml", cost: 45}, {title: "Hennessy 1L", cost: 68}] (6)

[{title: "Jack Daniels 1L", cost: 60}, {title: "Southern Comfort 2L", cost: 130}, {title: "Golden Label 1L", cost: 120}, {title: "Grey Goose 1L", cost: 31}, {title: "Remy Martins 750ml", cost: 45}, {title: "Hennessy 1L", cost: 68}, {title: "Johnnie Walker 1L", cost: 50}] (7)

[{title: "Jack Daniels 1L", cost: 60}, {title: "Southern Comfort 2L", cost: 130}, {title: "Golden Label 1L", cost: 120}, {title: "Grey Goose 1L", cost: 31}, {title: "Remy Martins 750ml", cost: 45}, {title: "Hennessy 1L", cost: 68}, {title: "Johnnie Walker 1L", cost: 50}, {title: "Double Black 750ml", cost: 55}] (8)
 

С каждой итерацией в последующий массив добавляется еще один объект, что означает, что только последний массив содержит все, что требуется. Можно ли настроить таргетинг на конкретный массив, который приводит к восьмому циклу, и записать его отдельно в качестве результата? т.е. этот конкретный массив:

 [{title: "Jack Daniels 1L", cost: 60}, {title: "Southern Comfort 2L", cost: 130}, {title: "Golden Label 1L", cost: 120}, {title: "Grey Goose 1L", cost: 31}, {title: "Remy Martins 750ml", cost: 45}, {title: "Hennessy 1L", cost: 68}, {title: "Johnnie Walker 1L", cost: 50}, {title: "Double Black 750ml", cost: 55}] (8)
 

Комментарии:

1. Пожалуйста, сделайте отступ в своем коде. Я не понимаю вопроса «Возможно ли настроить таргетинг на конкретный массив»? В вашем коде есть только один цикл, и он начинается с 0, вы могли бы начать его с 8-го элемента с переменной i = 7, если это то, что вы спрашиваете.

2. Я не уверен, в чем заключается ваш вопрос. Вы пытаетесь войти в систему после N элементов или после завершения всего цикла? Если последнее, поместите оператор log вне цикла. Если первое, знаете ли вы, что такое N каждый раз? Если да, просто проверьте, (i == N) . Если нет, как вы узнаете, какой вы хотите?

3. Просто переместите за console.log() пределы цикла for

Ответ №1:

Попробуйте так:

 function ready() {
  var items = document.querySelectorAll('.item');
  var data = [];

  for (var i = 0; i < items.length; i  ) { 
    var current = items[i];
    var name = current.getElementsByClassName('item-title')[0].innerText;
    var price = parseInt(current.getElementsByClassName('item-price')[0].innerText);
    var products = {};
    products.title = name;
    products.cost = price;
    data.push(products);

    //if you want to see what data looks like on the 8th iteration specifically, console.log with an if condition:
    if(i === 7) {
      console.log(data);
    };
  };

  //if you want to see what data looks like after the loop, console.log here:
  console.log(data);

  //...
};
 

Ответ №2:

Если вы переместите console.log() чуть ниже цикла for , вы увидите, что существует только один массив, который содержит все введенные значения. Нет необходимости вообще изменять поведение массива.

Ответ №3:

Вы можете использовать if оператор для выбора итерации, которую следует добавить:

 for (var i = 0; i < items.length; i  ) {
    if (i === 7)
    {
        var current = items[i];
        var name = current.getElementsByClassName('item-title')[0].innerText;
        var price = parseInt(current.getElementsByClassName('item-price')[0].innerText);
        var products = {};
        products.title = name;
        products.cost = price;
        data.push(products);
        console.log(data)
    }
 }
 

Как говорит mdn:

Оператор if выполняет оператор, если указанное условие соответствует действительности. Если условие неверно, может быть выполнен другой оператор.

Комментарии:

1. При такой скорости нет смысла использовать цикл for . Просто выполните операцию один раз над элементами [7].

2. @David может быть, было бы полезно, если OP захочет работать с другими индексами. Кроме того, это предотвращает передачу undefined значения, если массив не имеет такого индекса