繁体   English   中英

在javascript foreach中使用数组

[英]use array in javascript foreach

我有以下(简化)的php函数,它为我计算总价值。 它基本上是从wordpress数据库中获取一个项目数组,并检查每个项目的类型,然后将其值与特定的给定值进行比较,并将所有比较结果求和。

        function total(){ 
        $value1 = 10; // compare value for type 1 items
        $value1 = 20; // type 2 items
        $value1 = 30; // type 3 items
        $total = 0; // reset total variable

global $wpdb;
        $items = $wpdb->get_results("SELECT `item_type` as type, `item_value` as value FROM `table`"); // get all the items from database

        foreach ($items as $item) {

    // check which item type
        switch ($item->type) { 
          case 1:
         $total = $total + min($value1, $item->value);
            break;
          case 2:
          $total = $total + min($value2, $item->value);
            break;
          case 3:
         $total = $total + min($value3, $item->value);
            break;
        }}

        return $total;
        }

现在,我想在javascript中重新制作相同的函数,以便以某种形式使用它进行计算。 这就是我到目前为止所得到的。

<SCRIPT type="text/javascript">
 function calculate_total (){
    var items = <?php echo json_encode($items); ?>;
    var value1 = document.form.range1Input.value;
    var value2 = document.form.range2Input.value;
    var value3 = document.form.range3Input.value;

  for each (var item in items){
     switch (**(refer to item type in array)**) { 
          case 1:
         total = total + min(value1, **(refer to item value in array)**);
            break;
          case 2:
          total = total + min(value2, **(refer to item value in array)**);
            break;
          case 3:
         total = total + min(value3, **(refer to item value in array)**);
            break;
        }}

 document.form.total.value = total;
}
</script>

如何引用items数组中的值? 我希望有人能给我一些建议。

我也看到echo json_encode($items)将数组格式化为{"type":"3","value":"1.00"},{"type":"1","value":"20.50"}等等等,我想知道这是否是JavaScript的可用格式,因为当我尝试total = items[1]; 我在表格中看到[Object Object]

$items = $pdb->get_results()被格式化为Array ( [0] => stdClass Object ( [type] => 1 [value] => 35.00 ) [1] => stdClass Object ( [type] => 3 [value] => 1.00 )

您可能应该阅读JavaScript语法,但是有四种方法可以遍历数组:

TL; DR:如果您正在做会改变状态的事情,我建议您使用Array#forEach ,否则,建议使用Array#map

var myArray = [1,2,3,4,5,6];
var len = myArray.length;

1)for循环

for (var i=0; i<len; i++) {
  doSomethingTo(myArray[i]);
}

2)while循环

var i = 0; 
while (i<len) {
  doSomethingTo(myArray[i]);
  i++;
}

3)每次

myArray.forEach(function (element) {
  doSomethingTo(element);
});

4)地图

var newArray = myArray.map(function (element) {
  doSomethingTo(element);
});

在这四个图中,只有map才有回报。 它将在数组的每个元素上运行您赋予它的函数,并一起返回所有这些元素的数组。 while循环是最快的,但是如果可以的话,您应该避免强制执行这样的操作。

就像您推测的那样,您的第一个项目可以称为items[0] ,第二个项目可以称为items[1] ,依此类推。

因此,在您的for循环中的switch语句中/其中item引用当前索引(0、1、2等),您可以说items[item]引用您当前在循环中查看的项目:首先它将等于items[0] ,然后等于items[1] ,依此类推。

因此, switch (items[item].type) {应该是您所需要的。


(快速的JS概述:JS中的数组和对象是不同的东西,如果不确定,请查找差异。引用它们时,可以使用myArray[0]从数组中获取内容,也可以使用myObject['myKey']myObject.myKey来从对象中获取内容。在您的情况下, items是一个数组 ,其每个元素都是一个对象,因此可以执行items[0]['type']items[0].type访问您的第一项的类型)。


尝试使用items[1]只显示[Object object]的原因是因为浏览器不太擅长在屏幕上显示对象-该对象在那里,而JS可以看到它,只是大多数对象都被打印为[Object object] 您最好显示JSON.stringify(items[1])以将对象的JSON表示形式显示为字符串。 更妙的是,尝试使用console.log(items)console.log(items[1])在浏览器控制台中查看整个对象(您可以搜索如何打开浏览器控制台,每个浏览器/ OS都不一样,但非常适合调试)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM