0

我写了一个简单的函数来通过 JSON 数组值应用数学,它没有问题。

$(document).ready(function(){
    var arr1 = {"gold":"1000","iron":"2000","wood":"4500","food":"800"} ;
    var arr2 = [{"gold":"100","iron":"80","wood":"120","food":"70"}];
    Array.max = function( array ){
    return Math.max.apply( Math, array );
    };
    Array.min = function( array ){
        return Math.min.apply( Math, array );
    };
    function getValidenum(resources,cost) {
        var output = [] ;
         $.each(cost, function(i, item) {
          output.push(Math.floor(resources.gold / item.gold)) ;  
          output.push(Math.floor(resources.iron / item.iron)) ;
          output.push(Math.floor(resources.wood / item.wood)) ;
          output.push(Math.floor(resources.food / item.food)) ;
        });
        return Array.min(output) ;
    }
    alert(getValidenum(arr1,arr2));
});

当我向第二个数组添加更多值并尝试循环遍历数组以应用函数时,就会出现问题。

$(document).ready(function(){
    var arr1 = {"gold":"1000","iron":"2000","wood":"4500","food":"800"} ;
    var arr2 = [{"gold":"100","iron":"80","wood":"120","food":"70"},{"gold":"10","iron":"20","wood":"50","food":"30"}];
    Array.max = function( array ){
    return Math.max.apply( Math, array );
    };
    Array.min = function( array ){
        return Math.min.apply( Math, array );
    };
    function getValidenum(resources,cost) {
        var output = [] ;
         $.each(cost, function(i, item) {
          output.push(Math.floor(resources.gold / item.gold)) ;  
          output.push(Math.floor(resources.iron / item.iron)) ;
          output.push(Math.floor(resources.wood / item.wood)) ;
          output.push(Math.floor(resources.food / item.food)) ;
        });
        return Array.min(output) ;
    }
     $.each(arr2, function(i, item) {
          alert(getValidenum(arr1,item));
        });

});

而不是为 arr2 中的 2 个数组显示 2 次结果

var arr2 = [{"gold":"100","iron":"80","wood":"120","food":"70"},{"gold":"10","iron":"20","wood":"50","food":"30"}];

它显示 NaN 两次

4

1 回答 1

0

您已经更改了getValidenum在两个示例之间用作第二个参数的内容。

在第一个中arr2,您传入一个对象数组。

在第二个中,您传入item匿名函数的参数,即arr2数组中的一个对象。

如果您将第一个示例更改为也使用$.eachin 调用getValidenum,您会看到类似的失败。

当参数 of是一个对象NaN时,它本身会产生结果,因为它会将对象属性拆分为 key ( ) 和 value ( )。因此,在第二个示例的迭代中,您将具有以下值:costgetValidenum.eachiitem

i === "gold"
item === "100"

然后,当您尝试访问时item.gold,您实际上是在询问除以它时"100".gold哪个是undefined和产生。NaN

于 2013-04-14T01:04:48.073 回答