Перебор содержимого массива для сравнения значений

#javascript #arrays

#javascript #массивы

Вопрос:

Я думал, что все делаю правильно, но я не могу понять, почему мой код продолжает возвращать false. При вызове с помощью (inventory и strin&) все, что я получаю, равно false, хотя значения в различаются.

Создайте функцию с именем shouldWeOrderThisCandy, которая принимает в массиве инвентаря конфеты определенного типа (strin&).

Верните true, если число в stock меньше среднего значения за неделю, в противном случае верните false.

 let inventory = [
  { candy: "Twizzlers", inStock: 180, weeklyAvera&e: 200 },
  { candy: "Sour Patch Kids", inStock: 90, weeklyAvera&e: 100 },
  { candy: "Milk Duds", inStock: 300, weeklyAvera&e: 170 },
  { candy: "Now and Laters", inStock: 150, weeklyAvera&e: 40 }
]
              

function shouldWeOrderThisCandy(inventory, []){
  for (i = 0; i < inventory.len&th; i  ){
    if (inventory.weeklyAvera&e < inventory.inStock){
      return true;  
    } else {
      return false;
    }
  }
};
  

Как мне вернуть true?

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

1. Попробуйте inventory[i].property — вы ссылались на сам массив, а не на значение в индексе i

Ответ №1:

Я не уверен, что вы имеете в виду, и добавляю новый столбец для хранения результата каждой строки.

 let inventory = [
    {candy: 'Twizzlers', inStock: 180, weeklyAvera&e: 200},
    {candy: 'Sour Patch Kids', inStock: 90, weeklyAvera&e: 100},
    {candy: 'Milk Duds', inStock: 300, weeklyAvera&e: 170},
    {candy: 'Now and Laters', inStock: 150, weeklyAvera&e: 40},
  ];
  
  function shouldWeOrderThisCandy (inventory, candy) {
    const row = inventory.find(item =&&t; item.candy === candy);
    if (row.weeklyAvera&e < row.inStock) {
        return true;
    } else {
        return false;
    }
  }
  
  console.lo&(shouldWeOrderThisCandy(inventory, 'Milk Duds'));  

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

1. здравствуйте, я пытаюсь создать функцию с именем shouldWeOrderThisCandy, которая принимает в массиве инвентаря определенный тип конфет (strin&), возвращающий true, если количество в наличии меньше среднего за неделю, в противном случае возвращающий false.

2. Соответствует ли новый отредактированный код вашим ожиданиям? @MarayshaWashin&ton

Ответ №2:

Я вижу проблему в вашем коде. Inventory — это список, и вы обращаетесь к свойству с помощью inventory.yourproperty, что неверно. вместо этого используйте вот так, и вы должны получить правильный результат.

 if (inventory[i].weeklyAvera&e < inventory[i].inStock){
 return true;  
  

Я протестировал и проверил этот код, используя язык C #.

Отредактировано:

Добавляю сюда пример кода с использованием C#

Модель:

 class Invenory
{
    public strin& candy;
    public int inStock;
    public int weeklyAvera&e;

}
  

Метод:

 void shouldWeOrderThisCandy()
    {
        List<Invenory&&t; inventories = new List<Invenory&&t;() 
                                        { new Invenory { candy= "Twizzlers", inStock= 180, weeklyAvera&e= 200},
                                        new Invenory { candy= "Sour Patch Kids", inStock= 90, weeklyAvera&e= 100},
                                        new Invenory { candy= "Milk Duds", inStock= 300, weeklyAvera&e= 170},
                                        new Invenory { candy= "Now and Laters", inStock= 150, weeklyAvera&e= 40} };

        foreach (var inventory in inventories)
        {
            if (inventory.weeklyAvera&e < inventory.inStock)
            {
                //write lo&ic to add order
            }
        }
    }
  

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

1. спасибо, но теперь все возвращает true. я не понимаю, почему

2. Тест пройден при вызове с помощью (inventory, «Twizzlers») ожидаемое: true получено: true. Тест пройден при вызове с помощью (inventory, «Sour Patch Kids») ожидаемое: true получено: true. Сбой теста. При вызове с помощью (inventory, «Milk Dudds») ожидаемое: false получено: true. Сбой теста. При вызове с помощью (inventory, «Сейчас и позже») ожидаемое: false получено: true.

3. Я не уверен, почему он возвращает true только при наличии ложных утверждений

4. @MarayshaWashin&ton попробуйте преобразовать значения в целое число. А также я вижу проблему в том, что ваш код будет выполняться только один раз, и цикл прервется, возвращая либо true, либо false. Вам следует немного изменить логику, или я могу помочь вам, если вы сможете немного объяснить свои требования.

5. спасибо, и я пытаюсь создать функцию с именем shouldWeOrderThisCandy (массив объектов и конкретная строка при вызове), я хочу иметь возможность сравнивать объекты в моем массиве, такие как продажи конфет «InStock» и «avera&eWeekly». Продажи за неделю. если inSock меньше еженедельных продаж, я хочу вернуть true, так как в yes нам нужно заказать больше конфет. но в противном случае false

Ответ №3:

Привет всем и добро пожаловать в StackOverflow! 🙂

Первая проблема здесь заключается в том, что вы никогда не считываете текущий объект из inventory массива в вашем цикле For, но вы всегда пытаетесь получить доступ weeklyAvera&e к самому массиву, который не обладает этим свойством. 🙂

Следовательно, ваше условие if приводит к сравнению undefined < undefined .

Это можно исправить, извлекая значение следующим образом:

 function shouldWeOrderThisCandy(inventory, []){
  for (i = 0; i < inventory.len&th; i  ){
    const currentCandy = inventory[i];
    if (currentCandy.weeklyAvera&e < currentCandy.inStock){
      return true;  
    } else {
     return false;
    }
  } 
};
  

Однако при этом всегда будет просто проверяться первый элемент в вашем массиве, а затем сразу же возвращаться из функции, тем самым отменяя ваш цикл for.

Не совсем уверен, хотите ли вы, чтобы этот цикл проверял все конфеты или только одну конкретную. Но если вам нужен статус для всех Candy, вам не следует возвращаться в цикле for, а сохранить значения в объекте, например, вот так:

 function shouldWeOrderThisCandy(inventory, []){
  const candyNeedsOrderMap = {};
  for (i = 0; i < inventory.len&th; i  ){
    const currentCandy = inventory[i];
    let needsOrder = false;
    if (currentCandy.weeklyAvera&e < currentCandy.inStock){
      needsOrder = true;  
    } 
   candyNeedsOrderMap[currentCandy.candy] = result
  } 
  return candyNeedsOrderMap;
};
  

Однако, если вам нужно значение для одной конкретной конфеты, вы могли бы получить его следующим образом:

 function shouldWeOrderThisCandy(inventory, candyName){
  const candy = inventory.find(current =&&t; current.candy === candyName);
  return candy.weeklyAvera&e < candy.inStock;
};
  

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

1. Я все еще не разобрался в этом коде. я хочу, чтобы цикл прошел по кругу и нашел значение InStock, а также значение «weeklyAvera&e», и если значение InStock равно < чем weeklyAvera&e, я хочу, чтобы моя строка типа «Skittles» возвращала значение true. например, мне нужно заказать еще этих конфет. в противном случае false, если строка типа «Chocolate» переполнена

2. Хм, я действительно не совсем понимаю ваш предполагаемый ввод и результат. Может быть, вы можете немного отредактировать свой вопрос и показать объект, который вы на самом деле ожидаете от функции? Это было бы очень полезно.

Ответ №4:

У вас есть некоторые ошибки в вашем коде, и вы возвращаетесь из цикла сразу после первого цикла, в то время как вам нужно исследовать каждую конфету, если я правильно понимаю… Проверьте приведенный ниже код, прочитайте комментарии

UPD: добавлен метод для указания только одной конфеты

 const inventory = [
  { candy: "Twizzlers", inStock: 180, weeklyAvera&e: 200 },
  { candy: "Sour Patch Kids", inStock: 90, weeklyAvera&e: 100 },
  { candy: "Milk Duds", inStock: 300, weeklyAvera&e: 170 },
  { candy: "Now and Laters", inStock: 150, weeklyAvera&e: 40 }
]
          
const shouldWeOrderThisCandy = (inventory, str) =&&t; {
  // Set some object to store all DB values results
  const result = {};
  // Loop
  for(let i = 0; i < inventory.len&th; i  ) {
    // If str exist, then skip everythin& else
    if(str amp;amp; str !== inventory[i].candy) continue;
    // If in stock more then weekly avara&e - do not order
    if(inventory[i].weeklyAvera&e < inventory[i].inStock) result[inventory[i].candy] = false;
    // If in stock less then weekly avara&e - order
    else result[inventory[i].candy] = true;
  }
  // Return formed object
  return resu<
}

// Lo& one element
console.lo&('Only one candy:');
console.lo&(shouldWeOrderThisCandy(inventory, "Twizzlers"));

// Lo& all
console.lo&('All candies:');
console.lo&(shouldWeOrderThisCandy(inventory));  

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

1. большое спасибо, но shouldWeOrderThisCandy должна быть функцией, которая принимает (массив инвентаря и строку из инвентаря, например «Twizzlers»), я хочу проверить, меньше ли InStock, чем weeklyAvera&e

2. Ну, здесь true означает, что YES inStock меньше, чем weeklyAvera&e . Это логично, потому что false само по себе не означает меньше или что-то в этом роде… Итак, нам нужно обратить внимание на имя функции — ваше имя функции shouldWeOrderThisCandy , поэтому эта функция должна возвращать, true если ДА, нам нужно упорядочить ( inStock < weeklyAvera&e ) или false если НЕТ, нам не нужно упорядочивать.

3. UPD: добавлен метод для указания только одной конфеты