如何计算项目在数组中的次数

时间:2015-05-07 05:13:58

标签: javascript arrays algorithm search

我决定从一开始就再试一次,因为我现在更加清醒,然后逐步重建。我已经看了一些答案,似乎有很多方法可以解决这个问题。我试图用我迄今学到的东西来做这件事。我已经了解了变量,基本功能,对象,数组,这个'和推送方法。我知道,虽然,for while循环,虽然for循环是我理解的最好的。

这是我建立这个的新方法,我知道它不必要地长,但我希望能够基本了解如何将我在一起学习的不同事物拼凑成一个非常简单的办法。这更多的是学习如何构建简单的程序。然后我将继续微调程序,使其更简洁,更聪明。如果你能看一看,告诉我如何继续我到目前为止所做的事情......

这是代码,理想情况下,我希望在有新访问者的情况下运行一个功能。要求他们的姓名和号码。然后创建一个新的客户'具有给定姓名和号码的对象并将其推送给访问者'阵列。一旦我成功地弄清楚了,如果访问者是新用户,我会使用循环检查数组,并在每次访问时更新他们的访问次数。

datepart    | Abbreviations  
------------+---------------
hour        | hh 
minute      | mi, n 
second      | ss, s 
millisecond | ms 
microsecond | mcs
nanosecond  | ns 

最后一位返回" [object,object]"的属性为什么呢?

8 个答案:

答案 0 :(得分:1)

你不仅让自己感到困惑,而且还使浏览器崩溃了! : - )

for循环永远不会终止,因为您在每次迭代时都会将新值推送到列表中。)

我可以更详细地告诉你代码有什么问题,但如果你自己追逐它,你会学到很多东西。所以你现在需要学习调试的艺术。

debugger函数的开头添加test()语句:

var list = ["111", "222", "333", "444", "555", "666"];

var test = function(input){
    debugger;
    var info = prompt("hi " + input + " what is your name?");
    for(i=0; i< list.length; i++){
        if( info === list.length[i]){
            console.log(list[i]);
        }
        else{
            list.push(info);
        }
        console.log(list);
    }

}

现在运行test(),它将在该语句的调试器中停止。查看调试器中的不同面板 - 您可以查看变量和其他内容。找到它有控件的位置,让您单步执行代码。单步执行代码并随时查看变量。您很快就会发现问题所在。在大多数浏览器中,还有键盘快捷键,可让您更轻松地单步执行代码。

如果您使用Chrome,则此处为introduction to the Chrome DevTools。其他浏览器也有类似的教程。

答案 1 :(得分:0)

这是一个算法:

使用对象存储用户号。和伯爵。喜欢:

  

{ “222”: “3”, “444”: “1”}

这意味着222次访问过3次,444次访问过一次。现在每次用户签入时都会:

  1. 查看是否存在具有用户编号的密钥,如果是则增加计数。如果不是,请添加一个count = 1的新条目。
  2. 检查数字是否为5,如果是,则获取免费咖啡并重置计数为零。如果没有,请跳过。

答案 2 :(得分:0)

我会通过将访问计数存储在一个字典中来解决问题,该字典将每个客户的ID映射到他们访问过的次数。字典最初是空的。当您第一次在字典中查找ID时,您将获得undefined,它会告诉您必须初始化该值。

以下演示有几个按钮,您可以使用这些按钮让Alice或Bob访问该商店。单击底部的蓝色按钮开始演示。

function message(s) {  // Simple output for a code snippet.
  document.getElementById('display').innerHTML += s + '<br />';
}

var coffeeCount = {};  // Stores the number of visits by each customer.

function customerVisit(id) {  // Called when a customer visits.
  if (coffeeCount[id] === undefined) {  // Check for first visit.
    coffeeCount[id] = 0;                // Initialize the visit count.
  } 
  var count = ++coffeeCount[id];        // Increment the visit count.
  message(id+': '+count+' visit'+(count == 1 ? '' : 's'));
  if (count % 5 == 0) {                 // Check for free coffee.
    message('&rarr; Free coffee for customer '+id+'!');
  } 
}
<button onclick="customerVisit('Alice')">Alice</button>

<button onclick="customerVisit('Bob')">Bob</button>

<div id="display"></div>

答案 3 :(得分:0)

尝试使用input元素;将访问次数设置为对象id的属性infolist的值;使用test value元素调用inputid;或者在promptinfo。在五次访问时,显示咖啡,将value的{​​{1}}重置为id

0
var list = {
  "111": 0,
  "222": 0,
  "333": 0,
  "444": 0,
  "555": 0,
  "666": 0
};

var test = function test(id) {
  coffee.innerHTML = "";
  var info;
  if (id.length > 0 && !/^(\s)/.test(id)) {
    if (list.hasOwnProperty(id)) {
      ++list[id];

    } else {
      list[id] = 1;
    }
    info = confirm("hi " + id + " this is your " + list[id] + " visit");
  } else {
    info = prompt("hi, please enter an id");
    if (!!info && !/^(\s)/.test(info) && list.hasOwnProperty(info)) {
      list[info] = 1;
      confirm("hi " + info + " this is your " + list[info] + " visit");
    } else {
      info = prompt("hi, please input a different id");
      if (!!info && !/^(\s)/.test(info) && !list.hasOwnProperty(info)) {
        list[info] = 1;
        confirm("hi " + info + " this is your " + list[info] + " visit");
      }
    };
    alert("please try a different id")
  };

  for (var id in list) {
    if (list[id] === 5) {
      alert("hi " + id + ", thanks for visting " + list[id] + " times");
      coffee.innerText = "☕";
      list[id] = 0;
      break;
    }
  };

  console.log(list);

};

var inputs = document.querySelectorAll("input");
var coffee = document.getElementById("coffee");
coffee.style.fontSize = "5em";

inputs[1].onclick = function(e) {
  test(inputs[0].value)
};

答案 4 :(得分:0)

n是客户数量

最初的数组是[0,0,0,..... n次]

所有值均为0,因为没有客户访问过该商店。

n = 5 数组看起来像

var a=[0,0,0,0,0];

1)在数组中解决这个问题。

2)假设我们有大小为n 的数组。

3)然后数组的索引 0 ... n-1

4)因此我们可以将客户的id映射到索引。

5)值将保留索引的访问次数。

6)[5] = 11;这里5是索引,11是值

7)对于我们的问题,如果ID i 的客户,如果他访问,我们会增加 a [i] = a [i] +1

8)然后我们可以检查

if(a[i]+1 === 5) {
   console.log("Custumer "+ i + " get a free coffee");
   a[i]=0;
}
else {
   a[i]=a[i]+1;
}

答案 5 :(得分:0)

这里不需要复杂化,这只是一个简单的方法,只需添加一个搜索用户输入次数的计数功能

 var list = ["111", "222", "333", "444", "555", "666"];
var test = function(input){
  var info = prompt("hi " + input + " what is your name?");
  var check=0;
    for(i=0; i< list.length; i++){
        if( info === list[i]){
           check=1;
           break;
          }
         }

       list.push(info);

       if(check==1){
             count(info);
       }

    }
 function count(info){ 
       var count=0;
       for(i=0; i< list.length; i++){
             if(list[i]===info)
                  count++;
               }
       console.log(count);
      }
    }

答案 6 :(得分:0)

我决定从一开始就再试一次,因为我现在更加清醒,然后逐步重建。我已经看了一些答案,似乎有很多方法可以解决这个问题。我试图用我迄今学到的东西来做这件事。我已经了解了变量,基本功能,对象,数组,这个&#39;和推送方法。我知道,虽然,for while循环,虽然for循环是我理解的最好的。

这是我建立这个的新方法,我知道它不必要地长,但我希望能够基本了解如何将我在一起学习的不同事物拼凑成一个非常简单的办法。这更多的是学习如何构建简单的程序。然后我将继续微调程序,使其更简洁,更聪明。如果你能看一看,告诉我如何继续我到目前为止所做的事情......

这是代码,理想情况下,我希望在有新访问者的情况下运行一个功能。要求他们的姓名和号码。然后创建一个新的客户&#39;具有给定姓名和号码的对象并将其推送给访问者&#39;阵列。一旦我成功地弄清楚了,如果访问者是新用户,我会使用循环检查数组,并在每次访问时更新他们的访问次数。

//array that will contain 'Customer' objects
var visitors = [john];

//Customer object
function Customer(name, phonenumber){
  this.name = name;
  this.phonenumber = phonenumber;
//will eventually add a "visits" method logging number of visits

}

var john = new Customer("john smith", "333");

//visitor funtion that runs everytime there is a new visitor
var visitor = function(){

  //visitor does not have a set name or number yet
  var userNumber = "variable userNumber is currently equal to " + 0;
  var userName = "variable userName is currently set to " + undefined;
  console.log(userName, userNumber);

  //ask for visitor name and number
  var askNumber = prompt("type your number");
  var askName = prompt("what is your name?");

  //store user name and number in two variables
  var userNumber = "variable 'userNumber' is now equal to " + askNumber; 
  var userName = "variable userName is now set to " + askName;

  //print out the new variables 
  console.log(userNumber);
  console.log(userName);

  //print who the phone number belongs to, this lets me see that the above code worked correctly
  var userNumber = askNumber;
  var userName = askName;
  console.log("Phone number " + userNumber + " belongs to " + userName);

  //make new customer object with the given name and number
  var userNumber = new Customer();
  userNumber.name = askName;
  userNumber.phonenumber = askNumber;

  console.log("properties of " + userNumber);  

};

最后一位返回&#34; [object,object]&#34;的属性为什么呢?

答案 7 :(得分:0)

我将给你一个简短的函数来检查一个特定值在数组中的次数:

function countHowManyTimesAValueIsOnArray(arr, valueToCheck){
    return  arr.filter(function(arrayValueToCompare){
        return arrayValueToCompare === valueToCheck;
    }).length
}

注意使用'==='而不是'=='。这将比较考虑其类型的值。 222将不会被发现为“222”