2015-06-29 3 views
0

У меня естьКак получить пару ключ-значение из массива объектов JavaScript?

var results = {}; 

Я написал код, заполняющий результаты (из запроса HTTP GET) с данными в этом формате:

({ 
    "result":[ 
    { 
     "Longitude" : "-097.722382", 
     "Zipcode" : "78751", 
     "ZipClass" : "STANDARD", 
     "County" : "TRAVIS", 
     "City" : "AUSTIN", 
     "State" : "TX", 
     "Latitude" : "+30.310606" 
    } 
]} 
) 

Однако я хочу результаты иметь TRAVIS в качестве ключа, и затем добавьте еще одну переменную под названием count, которая подсчитывает, сколько всего было в этом графстве.

У меня возникли проблемы с доступом к ключам & значения; Кажется, я всегда получаю undefined. Как мне получить доступ к ключам?

Вот мой код. По сути, я переживаю кучу почтовых индексов, отфильтровывая только те, что находятся в Техасе.

var i = 0; 
var results = {}; 



/* 
var results = { 
    'TRAVIS': 10, 
    'DALLAS': 15, 
}; 

*/ 

function getValues(obj, key) { 
    var objects = []; 
    for (var i in obj) { 
     if (!obj.hasOwnProperty(i)) continue; 
     if (typeof obj[i] == 'object') { 
      objects = objects.concat(getValues(obj[i], key)); 
     } else if (i == key) { 
      objects.push(obj[i]); 
     } 
    } 
    return objects; 
} 




callback = function(response) { 
    //console.log('callback('+i+')'); 
    var str = ''; 
    response.on('data', function (chunk) { 
    str += chunk; 
    }); 



    response.on('end', function() { 
     console.log('Processing: ' + i); 
     // TODO: Parse JSON 
     str = str.replace(/['\(\)]/g, ""); 
     if(str.substring(0,1) == "{"){ 

     JSON.parse(str); 
} 





    if(str.substring(0,1) == "{"){ 

     if((str.substring(str.search("\"State\"") + 10, str.search("\"State\"") + 14)) == "\"TX\"") 
     { //console.log("THIS IS FROM TEXAS "); 

      results[i] = str; 



     } 
    } 



    setTimeout(function() { 
     i++; 
     if (i >= data.length) { 
     console.log(results); 


     } else { 
     fetch(); 
     } 
    }, 1000) 
    }); 
} 


function fetch() { 
    //console.log('fetch('+i+')'); 
    var options = { 
    host: 'gomashup.com', 
    path: '/json.php?fds=geo/usa/zipcode/'+ JSON.parse(data[i].zip) 
    }; 
    http.request(options, callback).end(); 
} 

fetch(); 
+0

Как мы можем знать, что не так, если вы не показываете нам свой нерабочий код? –

+0

- это ваше требование отделить значения от заполненного результата? – aashima

ответ

0

Если вы eval(%yourcode%), то он вернет вам объект, который имеет один ключ «результата», который указывает на массив только с одним значением внутри - массив с вашей информации парами. Таким образом, чтобы получить доступ к этим ключам, вы должны повторять этот объект - eval(%yourcode%)['result'][0], как это:

initialString = '({"result":[{"Longitude" : "-097.722382","Zipcode" : "78751","ZipClass" : "STANDARD","County" : "TRAVIS","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"}]})'; 
 
    
 
myObj = eval(initialString)['result'][0]; 
 

 
for (key in myObj) { 
 
    document.write(key + ': ' + myObj[key] + '<br>'); 
 
}


Например, если вы собираетесь иметь свой объект результата содержит множество объектов, вы должны перебирать (myObj = eval(initialString)['result']), как это:

initialString = '({"result":[{"Longitude" : "1","Zipcode" : "78751","ZipClass" : "STANDARD","County" : "TRAVIS","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"},{"Longitude" : "2","Zipcode" : "78751","ZipClass" : "STANDARD","County" : "TRAVIS","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"},{"Longitude" : "3","Zipcode" : "78751","ZipClass" : "STANDARD","County" : "TRAVIS","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"}]})'; 
 
    
 
myObj = eval(initialString)['result']; 
 

 
myObj.forEach(function(infoItem,index) { 
 
    document.write('Item #' + (index+1) + "<br>"); 
 
    for (key in infoItem) { 
 
    document.write('&nbsp;&nbsp;&nbsp;&nbsp;' + key + ': ' + infoItem[key] + '<br>'); 
 
    } 
 
});


О, если вы хотите создать «результат» объект, который будет содержать округ, как ключ и почтовый индекс в качестве значения, вы можете сделать это следующим образом:

// in this example `myObj` has 3 objects inside itself 
 
// we iterate through each and select values that we need 
 

 
var initialString = '({"result":[{"Longitude" : "1","Zipcode" : "78751","ZipClass" : "STANDARD","County" : "TRAVIS","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"},{"Longitude" : "2","Zipcode" : "37465","ZipClass" : "STANDARD","County" : "SOMECOUNTY","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"},{"Longitude" : "3","Zipcode" : "90210","ZipClass" : "STANDARD","County" : "MYBELOVEDCOUNTY","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"}]})', 
 
    result = {}; 
 

 
myObj = eval(initialString)['result']; 
 

 
myObj.forEach(function(infoItem,index) { 
 
    // here we create entries inside 'result' object 
 
    // using county values as keys 
 
    result[infoItem['County']] = infoItem['Zipcode']; 
 
}); 
 

 
document.write(JSON.stringify(result,null,'<br>'));


Извините, я наконец получил то, что вам нужно) Посмотрите:

// in this example `myObj` has 4 objects inside itself 
 
// we iterate through each and select values that we need 
 

 
var initialString = '({"result":[{"Longitude" : "1","Zipcode" : "78751","ZipClass" : "STANDARD","County" : "TRAVIS","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"},{"Longitude" : "2","Zipcode" : "37465","ZipClass" : "STANDARD","County" : "SOMECOUNTY","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"},{"Longitude" : "3","Zipcode" : "90210","ZipClass" : "STANDARD","County" : "MYBELOVEDCOUNTY","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"},{"Longitude" : "4","Zipcode" : "90210","ZipClass" : "STANDARD","County" : "MYBELOVEDCOUNTY","City" : "AUSTIN","State" : "TX","Latitude" : "+30.310606"}]})', 
 
    result = {}; 
 

 
myObj = eval(initialString)['result']; 
 

 
myObj.forEach(function(infoItem,index) { 
 
    // here we create entries inside 'result' object 
 
    // using county value as a keys 
 

 
    // first we check if an entry with current key exists 
 
    if (result[infoItem['County']]) { 
 
    // if yes, just increment it 
 
    result[infoItem['County']]++; 
 
    } else { 
 
    // if no, make it equal to 1 
 
    result[infoItem['County']] = 1; 
 
    } 
 
}); 
 

 
document.write(JSON.stringify(result,null,'<br>'));

+0

Спасибо. Но поскольку это цикл (тот, который я опубликовал, был всего лишь примером), и есть несколько почтовых индексов, что бы я вложил внутри 's'? – user3583412

+0

Я немного отредактировал) – lucifer63

+0

Должен ли я начинать с фактических данных? Есть ли способ, которым я могу просто создать общую строку для initialString? Проблема, с которой я снова сталкиваюсь, пытается связать str [i] .County (например), но я не могу получить доступ к ключам. Если это имеет смысл. – user3583412

0
var response = ({ 
    "result":[ 
    { 
     "Longitude" : "-097.722382", 
     "Zipcode" : "78751", 
     "ZipClass" : "STANDARD", 
     "County" : "TRAVIS", 
     "City" : "AUSTIN", 
     "State" : "TX", 
     "Latitude" : "+30.310606" 
    } 
]}); 

You can excess key and value this way... 

console.log(response.result[0].County); 
console.log(response.result[0].Zipcode); 
And also add a key ...... 
response.result[0].count = 134; 
console.log(response); 
+0

Спасибо, но у меня есть цикл, который проходит через несколько почтовых индексов. Итак, как бы я сделал эту работу для всех? Я не могу сделать общий формат с конкатенацией, потому что мне нужно будет получить доступ к ключам и значениям результатов, которые я не могу сделать прямо сейчас. – user3583412

+0

Можете ли вы дать мне полный ответ http .... –

0

Что об использовании библиотеки, как подчеркивание? Это может быть достигнуто с помощью groupBy and map functions.

var grouped = _.groupBy(response.result, function(item){ 
    return item.County; 
}); 
var result = _.each(grouped, function(value, key, list){ 
    return list[key] = value.length; 
}); 

Взгляните на этот Plunker: http://plnkr.co/edit/fNOWPYBPsaNNDVX3M904

0

так Youre использованием nodejs вы можете установить строку магазина НПМ модуль. Он преобразует его в массив, и значения могут быть легко использованы. подробнее здесь. https://www.npmjs.com/package/stringstore

+0

Ответы на вопросы не должны содержаться в ссылках, поскольку они будут меняться со временем. Оставьте ссылку ссылкой, но ответ должен быть перенесен на этот сайт, если это применимо. – manotheshark

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