Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON和引用_Javascript_Json - Fatal编程技术网

Javascript JSON和引用

Javascript JSON和引用,javascript,json,Javascript,Json,我以JSON对象的形式接收数据,如下所示: [{"transid":1091, "payee":"McDonalds", "amount":-549}, {"transid":1092, "payee":"McDonalds", "amount":-342}, {"transid":1093, "payee":"McDonalds", "amount":371}] alert(obj[0].amount); obj[transid].amount var transid = 1091;

我以JSON对象的形式接收数据,如下所示:

[{"transid":1091, "payee":"McDonalds", "amount":-549},
 {"transid":1092, "payee":"McDonalds", "amount":-342},
 {"transid":1093, "payee":"McDonalds", "amount":371}]
alert(obj[0].amount);
obj[transid].amount
var transid = 1091;
alert(obj[transid].amount);  //returns -549
我知道我可以像这样访问数据:

[{"transid":1091, "payee":"McDonalds", "amount":-549},
 {"transid":1092, "payee":"McDonalds", "amount":-342},
 {"transid":1093, "payee":"McDonalds", "amount":371}]
alert(obj[0].amount);
obj[transid].amount
var transid = 1091;
alert(obj[transid].amount);  //returns -549
但我希望能够访问如下数据:

[{"transid":1091, "payee":"McDonalds", "amount":-549},
 {"transid":1092, "payee":"McDonalds", "amount":-342},
 {"transid":1093, "payee":"McDonalds", "amount":371}]
alert(obj[0].amount);
obj[transid].amount
var transid = 1091;
alert(obj[transid].amount);  //returns -549
其中transid是先前声明和分配的变量,如下所示:

[{"transid":1091, "payee":"McDonalds", "amount":-549},
 {"transid":1092, "payee":"McDonalds", "amount":-342},
 {"transid":1093, "payee":"McDonalds", "amount":371}]
alert(obj[0].amount);
obj[transid].amount
var transid = 1091;
alert(obj[transid].amount);  //returns -549
如果这是可能的,我假设JSON对象必须重新构造,我无法控制如何接收JSON对象,但我真的不知道如何进行。我尝试过谷歌搜索和搜索,但我不知道该找什么


编辑:我已经看过了Travis J提出的重复问题,我不同意这是重复的。我不是要求循环浏览数据。我要求通过特定的索引引用方法,因为JSON我无法控制它是如何传入我的。建议的副本中接受的答案显示了我对第二个代码框中的代码的设想,但我认为它并没有真正回答我的问题。哈坎·比尔金(Hakan Bilgin)在提议的副本中给出了另一个答案,建议使用DeviantJS,这可能会奏效。但是,还有许多其他方法,其中一些已经作为这个问题的答案提供了。

您可以从该方法创建一个新对象。像这样的

var transactionArray=[ {transid:1091,收款人:麦当劳,金额:-549}, {transid:1092,收款人:麦当劳,金额:-342}, {transid:1093,收款人:麦当劳,金额:371} ]; var transactionsById={}; TransactionalRay.forEachfunctionelement{ transactionsById[element.transid]=元素; }; var transid=1091;
alerttransactionsById[transid]。金额//返回-549您可以从该对象创建新对象。像这样的

var transactionArray=[ {transid:1091,收款人:麦当劳,金额:-549}, {transid:1092,收款人:麦当劳,金额:-342}, {transid:1093,收款人:麦当劳,金额:371} ]; var transactionsById={}; TransactionalRay.forEachfunctionelement{ transactionsById[element.transid]=元素; }; var transid=1091; alerttransactionsById[transid]。金额//返回-549您可以使用like

您可以将上述函数添加到数组的原型中,如

Array.prototype.get = function(id){
    return Array.prototype.filter.call(this,function(obj){
        return obj['transid'] === id;
    })[0].amount
}
像这样使用它

obj.get(1091); // -549
您可以添加适当的验证,如处理未找到的密钥和重复项。

您可以使用

您可以将上述函数添加到数组的原型中,如

Array.prototype.get = function(id){
    return Array.prototype.filter.call(this,function(obj){
        return obj['transid'] === id;
    })[0].amount
}
像这样使用它

obj.get(1091); // -549

您可以添加适当的验证,如处理未找到的键和重复项。

如前所述,如果调用方请求集合中不存在的transid,则会引发异常。否则,这是最简单的方法。即使在找到正确的对象之后,filter仍会继续迭代。您可能想用一些来代替,这样您就可以打破循环。@bruno,谢谢您的回复。我遵循了ekuusela在上面对一些问题的评论。从阅读中我的理解是,有些返回真/假,我认为这与你的答案不符。但是,使用.find polyfill,我认为它可以正常工作。谢谢对于某些变量,您必须将找到的值分配给其他变量,并使用该变量而不是某些变量的返回值。如果您有polyfill,使用find会更好。var结果;a、 somefunctione{if e.id==id{result=e;返回true;}};如前所述,如果调用方请求集合中不存在的transid,则会引发异常。否则,这是最简单的方法。即使在找到正确的对象之后,filter仍会继续迭代。您可能想用一些来代替,这样您就可以打破循环。@bruno,谢谢您的回复。我遵循了ekuusela在上面对一些问题的评论。从阅读中我的理解是,有些返回真/假,我认为这与你的答案不符。但是,使用.find polyfill,我认为它可以正常工作。谢谢对于某些变量,您必须将找到的值分配给其他变量,并使用该变量而不是某些变量的返回值。如果您有polyfill,使用find会更好。var结果;a、 somefunctione{if e.id==id{result=e;返回true;}};这个问题并不是简单地在JavaScript对象中查找内容,而是关于这样做的语法。有一些相当有趣的方法可以让事情像OP建议的那样工作,包括一些预处理,但也包括像对象代理这样的事情,这些都不是通过假定的副本来解决的。应重新打开。Travis J对重复问题的回答目前排名第二,未被接受,具有暴力搜索方法。它看起来做得很好,但询问者对按索引排序的数据感兴趣。重复问题的首要答案包括如何处理索引数据,而不是如何转换。有一些代码作为起点,但无论如何都不是完全相同的。投票重开。@bruno和ekuusela:谢谢你们的回复。我希望我能把这两个都标记为已接受的答案!与.forEach方法相比,我更喜欢.filter方法,但到目前为止,这只是因为我还不知道
这两种解决方案的开销。假设我有100000个元素。哪一个对时间的影响较小?重组100000个元素,然后按照ekuusela直接访问数据,或者按照bruno过滤数据?我回家后会测试,但我很感激这两个答案。这个问题不完全是关于在JavaScript对象中查找东西,而是关于这样做的语法。有一些相当有趣的方法可以让事情像OP建议的那样工作,包括一些预处理,但也包括像对象代理这样的事情,这些都不是通过假定的副本来解决的。应重新打开。Travis J对重复问题的回答目前排名第二,未被接受,具有暴力搜索方法。它看起来做得很好,但询问者对按索引排序的数据感兴趣。重复问题的首要答案包括如何处理索引数据,而不是如何转换。有一些代码作为起点,但无论如何都不是完全相同的。投票重开。@bruno和ekuusela:谢谢你们的回复。我希望我能把这两个都标记为已接受的答案!与.forEach方法相比,我更喜欢.filter方法,但到目前为止,这只是因为我还不知道这两种解决方案的开销。假设我有100000个元素。哪一个对时间的影响较小?重组100000个元素,然后按照ekuusela直接访问数据,或者按照bruno过滤数据?我回家后会测试,但我很感激这两个答案。我稍后会接受。这是提问者所需要的,不在重复问题中+1感谢您在这方面的帮助。我对你和布鲁诺的答案都很满意。你的的确为我提供了我所寻求的句法解决方案。但是,我确实喜欢最终使用的Array.prototype解决方案。find而不是.filter。所以,我将不得不更多地感受它。。。我该选哪种蛋糕?有巧克力屑的巧克力,还是没有巧克力屑的三重巧克力?这是提问者所需要的,而不是重复问题+1感谢您在这方面的帮助。我对你和布鲁诺的答案都很满意。你的的确为我提供了我所寻求的句法解决方案。但是,我确实喜欢最终使用的Array.prototype解决方案。find而不是.filter。所以,我将不得不更多地感受它。。。我该选哪种蛋糕?有巧克力粉的巧克力,还是没有巧克力粉的三重巧克力?