Javascript 从js数据对象检索数据

Javascript 从js数据对象检索数据,javascript,Javascript,假设我正在检索一个包含用户信息的JSON对象。我得到的一条信息是一个代码,表示他们最喜欢的水果 因此,我有用户数据.faveFruit,我知道它的价值将是应用程序(苹果)、禁令(香蕉)、切(樱桃)或猕猴桃(猕猴桃)。我需要把有关用户最喜欢的水果的详细信息页面上的数据 所以我创建了这个数据对象: var fruitDefinitions = [ { "APP" : [ "Apple", "Red, green or yellow skin, round, white flesh, har

假设我正在检索一个包含用户信息的JSON对象。我得到的一条信息是一个代码,表示他们最喜欢的水果

因此,我有用户数据.faveFruit,我知道它的价值将是应用程序(苹果)、禁令(香蕉)、切(樱桃)或猕猴桃(猕猴桃)。我需要把有关用户最喜欢的水果的详细信息页面上的数据

所以我创建了这个数据对象:

var fruitDefinitions = [
    { "APP" : [ "Apple",  "Red, green or yellow skin, round, white flesh, hard core with seeds." ] },
    { "BAN" : [ "Banana", "Thick yellow skin, elongated curved cylinder tapered at both ends, white flesh." ] },
    { "CHE" : [ "Cherry", "Red skin and flesh, round, green stem, single inedible pit." ] },
    { "KIW" : [ "Kiwi",   "Brown furry skin, oval, green flesh, many small edible seeds." ] },
];
那么,我如何才能从CHE变为能够拉出樱桃及其描述呢?看起来应该很简单,但我的每一次尝试都不起作用。我应该以不同的方式构建水果定义吗

谢谢。

使用以下方法:

使用不同数据的示例:

var matches = [ { foo : 'bar' }, { zoo : 'zar' } ].filter(function(item) {
  return item.hasOwnProperty('zoo');
});

console.log(matches[0]) // should be { zoo : 'zar' }
您也可以这样存储对象:

var fruitDefinitions = {
     "APP" : [ "Apple",  "Red, green or yellow skin, round, white flesh, hard core with seeds." ] ,
     "BAN" : [ "Banana", "Thick yellow skin, elongated curved cylinder tapered at both ends, white flesh." ] ,
     "CHE" : [ "Cherry", "Red skin and flesh, round, green stem, single inedible pit." ] ,
     "KIW" : [ "Kiwi",   "Brown furry skin, oval, green flesh, many small edible seeds." ] ,
};
因此,您可以这样访问您的数据:
foultdefinitions['BAN']

这只是一个foreach循环。不要对数组使用foreach循环


使用lxe建议的
Array.filter
方法。

我建议稍微重构数据:

var fruitDefinitions = {
    "APP" : [ "Apple",  "Red, green or yellow skin, round, white flesh, hard core with seeds." ],
    "BAN" : [ "Banana", "Thick yellow skin, elongated curved cylinder tapered at both ends, white flesh." ],
    "CHE" : [ "Cherry", "Red skin and flesh, round, green stem, single inedible pit." ],
    "KIW" : [ "Kiwi",   "Brown furry skin, oval, green flesh, many small edible seeds." ]
};
用于类似用途:

console.log(fruitDefinitions.CHE[0]); // Cherry
console.log(fruitDefinitions.CHE[1]); // Red skin and flesh, round, green stem, single inedible pit.

或许可以做得更紧凑,但作为第一种方法:

function findfavFruit(fCode) {
    for ( var n = 0, n < fruitDefinitions.length; n++ ) {
          if ( typeof fruitDefinitions[n][fCode] != undefined )
               return fruitDefinitions[n][fCode];
    }
    return null;
}
函数findfavFruit(fCode){
对于(var n=0,n<0.length;n++){
if(类型定义[n][fCode]!=未定义)
返回定义[n][fCode];
}
返回null;
}
这将返回一个数组

[“樱桃”,“红色果皮和果肉,圆形,绿色茎,单个不可食用的果核。”]


对于“CHE”

访问水果名称

fruitDefinitions[0]['APP'][0]
水果描述访问

  fruitDefinitions[0]['APP'][1]
如果您的输入是动态的,那么您可以分别为水果名称和描述编写以下代码

 fruitDefinitions[0][input][0]

当您的数组包含多个值时,则会有数组的索引号而不是“0”,这意味着您的结构将是

       fruitDefinitions[i]['APP'][1]
       ......
这里“i”是数组的索引号


但是如果结构像lxe所说的那样,那就好了如果你真的想完全重组它,离开JSON的东西,做一个完整的OO设计,它实际上需要:

var fruit = function(code, name, desc) {
    this.name = name;
    this.code = code;
    this.description = desc;

    this.getName = function() { return this.name }
    ....
}

var fruits = function() {

    this.fav = []
    this.add = function(name, desc, code) {
        var f = new fruit(code, name, desc);
        this.fav.push(f);

    ....
    etc. etc.

不要在数组中使用for..in循环!Ups,我刚刚看到了花括号。对于这个问题,我们的水果定义对象不是一个特别好的结构。考虑一些类似于<代码> var水果= [ {代码:“CHE”),名称:“樱桃”,描述:“红色皮肤…”},{代码:“app”,名称:“苹果”,描述:“红色,绿色…}”;<代码>,然后您可以使用合理干净的filter/map/reduce调用来执行大多数有趣的查询。如果按代码快速查找是最重要的,请将代码移到单个定义映射对象的键或构建索引(一个reduce语句就可以了)。这是一个对象数组,而不是对象。@Axel现在可以了吗?不可以。你怎么知道它是0而不是872367648?
var fruit = function(code, name, desc) {
    this.name = name;
    this.code = code;
    this.description = desc;

    this.getName = function() { return this.name }
    ....
}

var fruits = function() {

    this.fav = []
    this.add = function(name, desc, code) {
        var f = new fruit(code, name, desc);
        this.fav.push(f);

    ....
    etc. etc.