2014-09-13 52 views
0
{ 
    cardAid:ALPHG, 
    displayName:ALPHG, 
    port:A 
    } 
    { 
    cardAid:ALPHG, 
    displayName:ALPHG, 
port:B 
    } 
    { 
    cardAid:SFD, 
    displayName:SFD 
port:C 
    } 
    { 
    cardAid:SFD, 
    displayName:SFD 
port:D 
    } 
    { 
    cardAid:ARR, 
    displayName:ARR 
port:E 
    } 

HI,我有一个JSON如上,我特林迭代thrugh的JSON来获得输出作为 CardName:ALPHG 计数:2 端口:A,B Cardname:SFD 计数:2 端口:C,d CardName:ARR 计数:1 端口:电子要从JavaScript中获取JSON计数的数量?

var map = new Object; 
var count=0; 
for(var index=0;index<arr.length;index++) 
{ 
     countOfPort.push({name: arr[index].cardAid.trim()}); 
} 
for(var index=0;index<countOfPort.length;index++) 
{ 
     for(var i=0;i<arr.length;i++) 
     { 
     try{ 

     if(countOfPort[index].name == arr[i].cardAid) 
       { 
       count++; 
       map.cardName = countOfPort[index].name; 
       } 
       map.portCount=count; 
       } 
     catch(e) 
     { 
     console.log("exception"+e); 
     } 
     } 
} 
return map; 
} 

我使用下面的代码被赋予O/p为, CardName:ALPHG 计数:1 端口:一个 Cardname:ALPHG 数:1 端口:乙 CardName:SFD 数:1 端口:C

+0

jsfiddle演示与以上json将是惊人的! – 2014-09-13 12:01:53

回答

0

嗯,首先这不是有效的JSON。您需要围绕它的数组分隔符,项目之间的逗号以及所有标识符和所有字符串周围的分隔符。

您拥有的代码不会返回您描述的内容。它返回这个:

{ cardName: "ARR", portCount: 9 } 

你的第一个循环似乎打算获得不同的卡名称,但它不是。它只是以与输入数组中的顺序相同的顺序生成卡名称的另一个数组。第二个循环查找输入数组中的卡片名称,但由于您在countOfPort数组中有重复项目,因此这些项目将被多次匹配。这就是为什么你的端口数是9,而数据中只有五个端口。

只需循环一次数组,然后在地图中使用卡片名称作为标识符。如果已经在地图上存在的名称,然后添加到它,否则在地图上添加新项:

var json = '[{"cardAid":"ALPHG","displayName":"ALPHG","port":"A"},{"cardAid":"ALPHG","displayName":"ALPHG","port":"B"},{"cardAid":"SFD","displayName":"SFD","port":"C"},{"cardAid":"SFD","displayName":"SFD","port":"D"},{"cardAid":"ARR","displayName":"ARR","port":"E"}]'; 

var arr = JSON.parse(json); 
console.log(count(arr)); 

function count(arr) { 
    var map = {}; 
    for (var i = 0; i < arr.length; i++) { 
     var name = arr[i].cardAid; 
     var port = arr[i].port; 
     if (name in map){ 
      map[name].Count++; 
      map[name].Port += ',' + port; 
     } else { 
      map[name] = { Count: 1, Port: port }; 
     } 
    } 
    return map; 
} 

该函数将返回一个对象:

{ 
    ALPHG: { Count: 2, Port: "A,B" }, 
    ARR: { Count: 1, Port: "E" }, 
    SFD: { Count: 2, Port: "C,D" } 
} 

演示:http://jsfiddle.net/0kq7ucrm/

0

正确格式化您的JSON,以便读者更容易使用。

这类问题最好用下划线库解决 http://underscorejs.org/

这是您的数据:

var data = [ 
    { 
     cardAid: "ALPHG", 
     displayName: "ALPHG", 
     port: "A" 
    }, 
    { 
     cardAid: "ALPHG", 
     displayName: "ALPHG", 
     port: "B" 
    }, 
    { 
     cardAid: "SFD", 
     displayName: "SFD", 
     port: "C" 
    }, 
    { 
     cardAid: "SFD", 
     displayName: "SFD", 
     port: "D" 
    }, 
    { 
     cardAid: "ARR", 
     displayName: "ARR", 
     port: "E" 
    } 
]; 

这是代码你的需要:

var result = _.map(_.groupBy(data, "cardAid"), function(group, cardAid) { 
    return { 
     cardAid: cardAid, 
     count: _.size(group), 
     port: _.pluck(group, "port") 
    }; 
}); 

这是结果你会得到:

// result: 
// [ 
//  { 
//   "cardAid": "ALPHG", 
//   "count": 2, 
//   "port": ["A", "B"] 
//  }, 
//  { 
//   "cardAid": "SFD", 
//   "count": 2, 
//   "port": ["C", "D"] 
//  }, 
//  { 
//   "cardAid": "ARR", 
//   "count": 1, 
//   "port": ["E"] 
//  } 
// ] 
+0

好吧,我不同意添加一个大型图书馆总是最好的解决方案,或者如果你使用一个图书馆,下划线将是唯一可能的候选人。 – Guffa 2014-09-13 12:58:47

+2

下划线是5K缩小和gzipped。 – 2014-09-13 13:15:20