2015-12-26 46 views
5

Làm cách nào để chỉ lấy tên từ tệp JSON. Ngoài ra, mã hoàn toàn hoạt động để nhận dữ liệu từ "file.json" tức là không phải là vấn đề.Chỉ lấy một phần tử từ mảng đối tượng trong JSON

JavaScript:

var data = []; 
 
function getName() { 
 
    //what should I write here to get only name from the first object i.e. John 
 
    //with this: data[0].name I am getting error! 
 
} 
 

 
var xhttp; 
 
if(window.XMLHttpRequest) 
 
    xhttp = new XMLHttpRequest(); 
 
else 
 
    xhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
 
    
 
xhttp.onreadystatechange = function() { 
 
    if(xhttp.readyState == 4) { 
 
    data = JSON.parse(xhttp.responseText); 
 
    getName(); 
 
    } 
 
} 
 

 
xhttp.open("GET","file.json",true); 
 
xhttp.send();

"file.json" - JSON:

[ 
 
    { 
 
    "name":"John", 
 
    "city":"London" 
 
    }, 
 
    { 
 
    "name":"Maria", 
 
    "city":"Rome" 
 
    } 
 
]

+0

(Thay vì 'onreadystatechange' và' readyState', bạn chỉ có thể sử dụng 'onload'.) – Rudie

+0

Làm việc tốt cho tôi, như trong, không có lỗi. Lỗi của bạn là gì? https://jsfiddle.net/rudiedirkx/0xf62ny6/ ghi lại toàn bộ đối tượng dữ liệu và sau đó là 'dữ liệu [0] .name ' – Rudie

+1

Lỗi là gì? Tại sao bạn sử dụng biến toàn cục thay vì truyền giá trị cho hàm? –

Trả lời

6

Vượt qua dữ liệu biến thông qua chức năng

var data = []; 
function getName(data) { 
    return data[0].name; 
} 

var xhttp; 
if(window.XMLHttpRequest) 
    xhttp = new XMLHttpRequest(); 
else 
    xhttp = new ActiveXObject("Microsoft.XMLHTTP"); 

xhttp.onreadystatechange = function() { 
    if(xhttp.readyState == 4) { 
    data = JSON.parse(xhttp.responseText); 
    getName(data); 
    } 
} 

xhttp.open("GET","file.json",true); 
xhttp.send(); 

Ngoài ra, nếu bạn muốn lấy tất cả các tên, bạn có thể làm một cái gì đó như thế này:

function getName(data) { 
    var names = []; 
    for (var i = 0; i < data.length; i++) { 
     names.push(data[i].name); 
    } 
    return names; 
} 

(Dữ liệu được các dữ liệu mảng)

+0

nó chỉ cung cấp tên đầu tiên của chỉ mục –

+0

tất nhiên, nhưng nó không phải là bạn muốn? Hoặc bạn muốn trả về một mảng tên? –

+0

tôi nghĩ rằng tác giả của câu hỏi này đang tìm kiếm để có được tất cả các tên trong tập tin json không tìm kiếm để có được chỉ có duy nhất tên –

4

Sử dụng Array.prototype.map() để Transfrom mục của mảng của bạn:

data.map(function(item) { 
    return item.name 
}); 
+0

Chức năng jQuery này có phải không? –

+0

không, đó là javascript thuần túy – madox2

1

chức năng getName của bạn sẽ trông như thế này:

function getName(){ 
    a.forEach(function(i,j){ 
    console.log(i.name); 
    }); 
} 
0

Điều đáng nói đến là các kiểu dữ liệu JSON được ánh xạ trực tiếp tới các kiểu dữ liệu javascript chuẩn. Điều đó có nghĩa là không có thứ gì như mảng JSON, khi bạn JSON.parse() một chuỗi, sau đó bạn nhận được các đoạn mã JavaScript thuần túy: mảng, đối tượng, chuỗi, số, v.v.

Vì vậy, việc nhận một phần tử từ một mảng JSON chỉ truy cập vào phần tử của một mảng javascript chuẩn. Điều này thường đạt được bởi toán tử dấu ngoặc vuông var element = array[index].

Mã của bạn tuy nhiên bị hỏng ở một số phần không liên quan đến truy cập phần tử mảng.

Trước tiên, bạn xác định biến số data ở mức cao - bạn chỉ không cần ở đó (ít nhất là theo mẫu).

Sau đó, bạn khởi tạo nó bằng một mảng trống - Tôi không biết tại sao.

Gọi lại onreadystatechange đơn giản khi được thể hiện bằng chữ: bạn nhận được một chuỗi, phân tích cú pháp thành json và sau đó gọi getName cung cấp kết quả. Điều đó có nghĩa là số getName() của bạn sẽ yêu cầu đối số data mà sau đó bạn truy cập trong hàm.

Các vấn đề liên quan