2011-04-07 4 views
0

Voici une longue chaîne (en fait une JSON valeur de clé):JavaScript: parser cette chaîne

"\u003cspan title=\"5 gold badges\"\u003e\u003cspan class=\"badge1\"\u003e●\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e5\u003c/span\u003e\u003c/span\u003e\u003cspan title=\"8 silver badges\"\u003e\u003cspan class=\"badge2\"\u003e●\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e8\u003c/span\u003e\u003c/span\u003e\u003cspan title=\"57 bronze badges\"\u003e\u003cspan class=\"badge3\"\u003e●\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e57\u003c/span\u003e\u003c/span\u003e"

je besoin d'un moyen pour analyser pour obtenir le nombre d'or, d'argent et d'insignes de bronze, en utilisant JScript simple dans Dashcode.

+0

Il ne ressemble en rien JSON pour moi. Il semble être un fragment HTML échappé. –

+0

oui c'est seulement une partie de json – yolo

Répondre

1
function getBadgeCounts(s) { 
    var badgeCountRE = /title="(\d+)/g, match = null, counts = []; 
    while ((match = badgeCountRE.exec(s)) !== null) { 
    counts.push(match[1]); 
    } 
    return {gold: counts[0], silver: counts[1], bronze: counts[2]}; 
} 

Sans médaille hardcoded noms:

function getBadgeCounts(s) { 
    var badgeCountRE = /title="(\d+) (\w+)/g, match = null, counts = {}; 
    while ((match = badgeCountRE.exec(s)) !== null) { 
    counts[match[2]] = match[1]; 
    } 
    return counts; 
} 
1

C'est ce que la chaîne est:

'<span title="5 gold badges"> 
     <span class="badge1">&#9679;</span> 
     <span class="badgecount">5</span> 
    </span> 
    <span title="8 silver badges"> 
     <span class="badge2">&#9679;</span> 
     <span class="badgecount">8</span> 
    </span> 
    <span title="57 bronze badges"> 
     <span class="badge3">&#9679;</span> 
     <span class="badgecount">57</span> 
    </span>' 

Peut-être que vous pouvez l'ajouter à un unvisible div, vous pouvez utiliser la méthode DOM pour obtenir les valeurs que vous voulez

+0

Semble qu'il pourrait le charger dans le DOM avec 'innerHTML =' puis lancer un jQuery dessus. –

1

Si vous mettez cette chaîne dans un appel jQuery, vous pouvez interroger le docu fragment ment comme vous le feriez tout autre morceau de code HTML:

var badgeHTML = "..." // Your encoded string here 

var parsedHTML = $(badgeHTML); // Returns a jQuery collection of HTML nodes 
1

var str = "\u003cspan title=\"5 gold badges\"\u003e\u003cspan class=\"badge1\"\u003e&#9679;\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e5\u003c/span\u003e\u003c/span\u003e\u003cspan title=\"8 silver badges\"\u003e\u003cspan class=\"badge2\"\u003e&#9679;\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e8\u003c/span\u003e\u003c/span\u003e\u003cspan title=\"57 bronze badges\"\u003e\u003cspan class=\"badge3\"\u003e&#9679;\u003c/span\u003e\u003cspan class=\"badgecount\"\u003e57\u003c/span\u003e\u003c/span\u003e";

var res = { 
    gold: 0, 
    silver: 0, 
    bronze: 0 
}; 

/* using a RexExp 
/     - delimeter 
(\d+)    - capturing one or more digits 
\s+     - one or more whitespace characters 
(gold|silver|bronze) - capturing the color 
/g     - delimeter (global flag) 

to match the information in the title of the spans 
and using the replace trick to populate res 
*/ 

str.replace(/(\d+)\s+(gold|silver|bronze)/g, function(all, count, color) { 
    res[color] += parseInt(count); 
}); 

console.log(res); // Object { gold=5, silver=8, bronze=57}