2015-06-29 1 views
1

Хорошо, поэтому я использую углы, чтобы получить json, сохраненный на моем компьютере, чтобы воссоздать учебную таблицу github.Как получить счет с вложенными объектами с определенным свойством?

Я могу получить данные с моим запросом $ http, но для любви ко мне все, что я хочу, - это подсчитать количество проблем с меткой «Еще нет».

Вот JavaScript:

$http.get('/api/github/repos/issues/all_issues/00All.json') 
    .then(function(response) { 
    console.log(response.data[0]); 
    var counter = 0; 
    for(var index = 0; index < response.data.length; index++) { 
     if(response.data[index].labels[0].name == "Not Yet") { 
     counter++; 
     }; 
    }; 
    console.log(counter); 
    }); 

Это последняя попытка, я также попытался использовать lodash, чтобы получить его раньше:

$http.get('/api/github/repos/issues/all_issues/00All.json') 
    .then(function(response) { 
    console.log(response); 
    mile.notYet.width = _.forEach(response.data, function(n){ 
     var counter = 0; 
     if(_.result(_.find(n.labels[0], 'name')) == "Not Yet") { 
     counter++; 
     } 
     console.log(counter); 
     counter = ((counter/10) * 100) + '%'; 
    }); 
    }); 

Это бит данных JSon:

[ 
    { 
    "url": "https://api.github.com/repos/TheIronYard--Orlando/2015--SUMMER--FEE/issues/11", 
    "labels_url": "https://api.github.com/repos/TheIronYard--Orlando/2015--SUMMER--FEE/issues/11/labels{/name}", 
    "comments_url": "https://api.github.com/repos/TheIronYard--Orlando/2015--SUMMER--FEE/issues/11/comments", 
    "events_url": "https://api.github.com/repos/TheIronYard--Orlando/2015--SUMMER--FEE/issues/11/events", 
    "html_url": "https://github.com/TheIronYard--Orlando/2015--SUMMER--FEE/issues/11", 
    "id": 73013825, 
    "number": 11, 
    "title": "00 -- Brace Yourself -- BEN GRIFFITH", 
    "user": { 
     "login": "Epicurean306", 
     "id": 11682684, 
     "avatar_url": "https://avatars.githubusercontent.com/u/11682684?v=3", 
     "gravatar_id": "", 
     "url": "https://api.github.com/users/Epicurean306", 
     "html_url": "https://github.com/Epicurean306", 
     "followers_url": "https://api.github.com/users/Epicurean306/followers", 
     "following_url": "https://api.github.com/users/Epicurean306/following{/other_user}", 
     "gists_url": "https://api.github.com/users/Epicurean306/gists{/gist_id}", 
     "starred_url": "https://api.github.com/users/Epicurean306/starred{/owner}{/repo}", 
     "subscriptions_url": "https://api.github.com/users/Epicurean306/subscriptions", 
     "organizations_url": "https://api.github.com/users/Epicurean306/orgs", 
     "repos_url": "https://api.github.com/users/Epicurean306/repos", 
     "events_url": "https://api.github.com/users/Epicurean306/events{/privacy}", 
     "received_events_url": "https://api.github.com/users/Epicurean306/received_events", 
     "type": "User", 
     "site_admin": false 
    }, 
    "labels": [ 
     { 
     "url": "https://api.github.com/repos/TheIronYard--Orlando/2015--SUMMER--FEE/labels/Not%20Yet", 
     "name": "Not Yet", 
     "color": "e11d21" 
     } 
    ], 

Как вы видите, свойство label - это объект, вложенный в массив, вложенный в объект, вложенный в ar ray, реальный симпатичный. Ввод меток [0] приводит к ошибке для меня каждый раз и не дает мне счет. Может ли кто-нибудь сказать мне, где я запутался, пожалуйста? Спасибо!

ответ

1

Если вам нужно решение, которое включает в себя lodash, который является гораздо более производительным, чем нативные функции высокого порядка, то вы можете попробовать это решение ниже:

var size = _(response.data) 
    .pluck('labels') 
    .flatten() 
    .where({ name: 'Not Yet' }) 
    .size(); 

UPDATE:

Если вы хотите быть более многоразовые, вы можете сохранить ссылку на клонированный прикован последовательности и просто поставить другой массив для этого клонируют последовательность.

var data1 = [/*array from data1*/]; 
var data2 = [/*array from data2*/]; 

var notYetSequence = _(data1) 
    .pluck('labels') 
    .flatten() 
    .where({ name: 'Not Yet' }); 

notYetSequence.size(); // returns data 1 count 
notYetSequence.plant(data2).size(); // returns data 2 count 
+0

«намного более результативный» --- любая ссылка для этого? – zerkms

+0

Конечно :). Код выше лениво оценивает код. Фактически выполняется только один цикл. Одна ссылка будет [это] (http: // filimanjaro.ком/блог/2014/введение-ленивой оценки /). – ryeballar

+0

Итак, если это 1 оператор цикла и 3 оператора, это скорее «просто очень немного более результативный», а не «намного больше». – zerkms

1

Вам не нужно lodash для выполнения этой задачи

var cnt = response.data 
    .map(function(i) { return i.labels; }) 
     // here we extract labels object only (and get an array of arrays of objects) 
    .map(function(i) { return i.filter(function(l) { return l.name == 'Not yet'; }).length; }) 
     // then for every nested array we return a number of items with 
     // Not Yet names (and get an array of numbers) 
    .filter(function(c) { return c > 0; }) 
     // then we filter issues that don't have one (and still get an array of numbers) 
    .length; 
     // and finally get length (which is a number) 
+0

Если я нахожу этот код в домашнем задании, @gatorpazz, мне лучше найти объяснение. ;) –

+0

Также предпочтительнее использовать Lodash для кросс-браузерной совместимости: не все реализации браузера предоставляют методы Iteration на 'Array'. Например, 'filter' находится только в IE9 +: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter#Browser_compatibility –

+0

@ ALtheX-the * map * и * filter * очень легко заменяется на петли for (которые также будут выполняться быстрее). – RobG

1

Для сравнения, обычный цикл выглядит следующим образом:

var data = response.data; 
    var count = 0; 
    var re = /not yet/i; 

    for (var a, i=0, iLen=data.length; i<iLen; i++) { 
    a = data[i].labels; 
    for (var j=0, jLen=a.length; j<jLen; j++) { 
     if (re.test(a[j].name)) ++count; 
    } 
    } 

Так на самом деле не много кода в любом случае, цикл будет совместим с каждым браузером когда-либо (хотя с помощью XMLHttpRequest средств по крайней мере ed 3+) и самый быстрый ... непроверенный, конечно. ;-)

Смежные вопросы