2016-09-11 45 views
2

我正在嘗試編寫一個函數,它可以將字段名稱作爲參數,並從JSON位返回相應值的數組。在JSON查詢中使用變量

例子中的物體:

var myObject = [ 
    {"x": 10, "y": 10}, 
    {"x": 20, "y": 10}, 
    {"x": 20, "y": 20}, 
    {"x": 10, "y": 20} 
]; 

我的功能看起來是這樣的:

function getValues(desiredValue) { 
    var values = []; 
    for (i = 0; i < myObject.length; i++) { 
     values[i] = myObject[i].desiredValue; 
    } 
    return values; 
} 
getValues(x); 

理想情況下,我會傳遞到getValues的說法x,而不是尋找一個字段名,其被稱爲desiredValue將尋找名爲x的字段名稱。

返回數組應該是這樣的:

[10,20,20,10] 

與此代碼的問題是顯而易見的,我怎麼能得到期望的結果?另外,我試圖避免不必要的依賴關係,所以除非絕對必要,否則請不要給我任何JQuery。

回答

1

您可以使用map()返回所需的結果。

var myObject = [ 
 
    {"x": 10, "y": 10}, 
 
    {"x": 20, "y": 10}, 
 
    {"x": 20, "y": 20}, 
 
    {"x": 10, "y": 20} 
 
]; 
 

 
function getValues(desiredValue) { 
 
    return myObject.map(e => e[desiredValue]); 
 
} 
 

 
console.log(getValues('x'))

+0

的重要組成部分,是'[desiredValue]'。 OP似乎沒有注意到他們已經以幾乎完全相同的方式使用了'[i]',這有點令人傷心...... –

0

一個簡單的工具

//also accepts a path like "foo.bar.baz" 
//returns undefined if path can't be resolved 
function fetch(path){ 
    var keys = path.split("."); 
    return function(target){ 
     for(var t = target, i = 0; i < keys.length; t = t[ keys[ i++ ] ]) 
      if(t == null) return void 0; 
     return t; 
    } 
} 

,它的用法

var myObject = [ 
    {"x": 10, "y": 10}, 
    {"x": 20, "y": 10}, 
    {"x": 20, "y": 20}, 
    {"x": 10, "y": 20} 
]; 

var result = myObject.map(fetch("y")); 

這個版本是有點比不帶Array.map()硬,因爲它可以很容易地與其它功能組成更加靈活。

雖然,特別是在這種特殊情況下,這已經有點矯枉過正。在這裏你可以很容易地寫:

var result = myObject.map(pt => pt.y); 

你不能得到更短,更簡單。或者,如果由於某種原因,性質確實是動態的,你必須包含它的一些變量:

var dynamicPropertyName = "y"; 
//... 
var result = myObject.map(pt => pt[ dynamicPropertyName ]); 
0

使用array map方法去做操縱對象的數組。

試試這個代碼:

var myObject = [ 
    {"x": 10, "y": 10}, 
    {"x": 20, "y": 10}, 
    {"x": 20, "y": 20}, 
    {"x": 10, "y": 20} 
]; 

var output = getValues("x"); 
console.log(output); 

function getValues(desiredValue) { 
    return myObject.map(function(item) { 
     return item[desiredValue]; 
    }); 
} 

輸出:

enter image description here

工作小提琴:https://jsfiddle.net/ffyjyzjb/