jquery复制json对象

时间:2009-12-21 02:59:48

标签: javascript jquery json extend

我正在迭代一组带有几个数据库表结果的json数据。在其他数据中,我有一个RateTable ... erm ...表和一个Resources表。 RateTable有一个属性名称ResourceId,它链接到Resources记录。

所以,我正在迭代我的RateTable,我需要引用我的资源记录并通过将其复制到它自己的变量中来使用它。以下是我到目前为止的情况:

if (data)
    {
        var rs = data.Resources;

        $.each(data.RateTables, function(i,item){
            if (item.RateTableTypeId == 91)
            {
                var r = getresource(item.SupplierResourceId, rs)
                if (r)
                    customer_options += '<option value="' + r.ResourceId + '">' + r.Name + '<\/option>';
            }
            else if (item.RateTableTypeId == 92)
            {
                var r = getresource(item.CustomerResourceId, rs)
                if (r)
                    supplier_options += '<option value="' + r.ResourceId + '">' + r.Name + '<\/option>';
            }

        });

        $(".ddl-customer").html(customer_options);
        $(".ddl-supplier").html(supplier_options);
    }

    function getresource(id, items)
    {
        $.each(items, function(i,item){
            if (item.ResourceId == id)
                return $.extend(true, {}, item);
        });
    }

我遇到的问题是getresource没有在变量r中返回我的Resource项的副本。为什么呢?

抱歉,我无法发布一些json数据,这绝对是巨大的,这就是为什么我们将引用留给客户端以减少数据负载。我希望有足够的东西帮助别人看到我想要做的事情。

劳埃德

2 个答案:

答案 0 :(得分:2)

  

我遇到的问题是getresource没有在变量r中返回我的Resource项的副本。为什么呢?

getresource 没有return语句。在getresource中的 $。each()调用所使用的匿名函数中有一个return语句。该return语句从匿名函数返回并返回 $。each() $。each()解释返回的值 - 如果有的话 - 作为指示是否继续迭代的布尔值。但是这个值永远不会传递回 getresource ,它没有返回语句来返回它。

有关 $。each()

的详细信息,请参阅http://docs.jquery.com/Utilities/jQuery.each#objectcallback

一种可能的解决方法是使用javascript的原生来代替循环,例如。

function getresource(id, items) {
    for (var i = 0; i < items.length; ++i) {
       var item = items[i];
       if (item.ResourceId == id) {
           return $.extend(true, {}, item);
       }
    }
}

另一个选择是继续使用 $。each()但是从 getresource 返回,例如

function getresource(id, items) {
    var r = null;
    $.each(items, function(i, item){
        if (item.ResourceId == id) {
            r = $.extend(true, {}, item);
            return false; // end $.each() loop
        }
    });
    return r;
}

答案 1 :(得分:1)

我承认我还在学习,我从未见过有人从函数中返回$.extend ...

如果没有找到值,Oren对你的要求是正确的,所以我会给他+1。

此外,我尝试使用return $.extend(false, {}, items);测试您的功能,似乎if (r)始终为真,因为r是一个对象,

我猜你试图从函数中返回两个变量?无论如何,从函数返回多个变量的最好方法是使用类似这样的东西:

function getresource(id, items)
    {
        $.each(items, function(i,item){
            if (item.ResourceId == id)
                return [true, item];
        });
        return false;
    }

然后r [0]包含布尔值,r [1]包含项目(如果为真)