2015-01-09 95 views
-3

讓我們說我們有以下的JSON對象:的JavaScript - 從JSON對象中提取陣列

[{"a1" : "a1Val", "a2" : "a2Val", "a3" : "a3Val"}, 
{"b1" : "b1Val", "b2" : "b2Val", "b3" : "b3Val"}, 

.... 

{"z1" : "z1Val", "z2" : "z2Val", "z3" : "z3Val"}] 

我們怎樣才能僅從X2鍵值對這個對象數組檢索。

意義,結果如下:

[ {"a2" : "a2Val"}, {"b2" : "b2Val"}, ... ,{ "z2" : "z2Val"}] 

最佳性能之內。

密鑰不一定包含數字。

我在這裏需要的是將收到的參數的函數 - 我 原始JSON對象

因此,舉例來說,如果我們看一下上面的JSON對象 返回所有第i個對象的數組並且我們調用我們2方法將返回的方法

[ {"a2" : "a2Val"}, {"b2" : "b2Val"}, ... ,{ "z2" : "z2Val"}] 

希望它足夠清楚。

+5

您的結果不是一個有效的數組。你想要一個對象('{「a2」:「a2Val」,「b2」:「b2Val」...}');一個對象數組('[{「a2」:「a2Val」},{「b2」:「b2Val」} ...]')還是別的? –

+0

這是您的數據的實際格式?你會一直有一個通過Z? –

+1

我希望你的意思是你想要一個只有指定對的字典?問題在於字典沒有排序。鑰匙實際上是否包含數字? –

回答

2

你可以使用Array.map這裏

var arr = oldArr.map(function(obj){ 
    var key = Object.keys(obj).sort()[1], rtn = {};  
    return rtn[key] = obj[key], rtn; 
}); 

你在做什麼,走的是第二個鍵,然後返回與該鍵和值的新對象。

+0

有你一樣的想法,但你的解決方案更有趣。該死的,我喜歡你在回報聲明中如何使用','! – Qwerty

+1

@Qwerty啊!你是第一個讚賞使用逗號運算符的人。謝謝你:) –

+0

@AmitJoki,謝謝,這是我見過的最優雅的方式。我會用你的方式! –

0

轉換爲數組,映射鍵,篩選結果,CONCAT這一切,等 這應該爲你工作:

var result = arr 
    .map(function (obj) { 
     return Object.keys(obj).map(function (key) { 
      var result = {}; 
      result[key] = obj[key]; 

      if (key.substring(1) === "2") { 
       return result; 
      } 
     }); 
    }) 
    .reduce(function (x, y) { return x.concat(y); }, []) 
    .filter(function (obj) { return obj }); 

See working fiddle

1

只是一個真正花哨的方式來做你所問的。小調整後適用於任何東西

var json = '[{"a1" : "a1Val", "a2" : "a2Val", "a3" : "a3Val"},{"b1" : "b1Val", "b2" : "b2Val", "b3" : "b3Val"},{"z1" : "z1Val", "z2" : "z2Val", "z3" : "z3Val"}]', 
    parsed = JSON.parse(json), 
    index = 2, // here goes your value 

    result = parsed.map(function(obj){ 
       var key = Object.keys(obj)[0][0]+index, 
        retDict = {}; 
       return retDict[key] = obj[key], retDict; 
      }); 

在控制檯中運行並查看。

0

這個怎麼樣:

var collection, key, obj, objArr, _i, _len, _tmp; 

collection = [ 
    { 
    "a1": "a1Val", 
    "a2": "a2Val", 
    "a3": "a3Val" 
    }, { 
    "b1": "b1Val", 
    "b2": "b2Val", 
    "b3": "b3Val" 
    } 
]; 

objArr = []; 

for (_i = 0, _len = collection.length; _i < _len; _i++) { 
    obj = collection[_i]; 
    for (key in obj) { 
    _tmp = {}; 
    _tmp[key] = obj[key]; 
    objArr.push(_tmp); 
    } 
} 
1

你可能會發現,這是更有效的利用齊磊功能解析您的JSON字符串時,要做到這一點。像這樣的東西。

var json = '[{"a1" : "a1Val", "a2" : "a2Val", "a3" : "a3Val"},{"b1" : "b1Val", "b2" : "b2Val", "b3" : "b3Val"},{"z1" : "z1Val", "z2" : "z2Val", "z3" : "z3Val"}]', 
 
    data = JSON.parse(json, function (key, value) { 
 
     if (key !== "" && typeof value === 'object') { 
 
      Object.keys(value).forEach(function (name) { 
 
       if (name.slice(-1) !== '2') { 
 
        delete value[name]; 
 
       } 
 
      }); 
 
     } 
 

 
     return value; 
 
    }); 
 

 
document.body.appendChild(document.createTextNode(JSON.stringify(data)));

+0

我想你的答案以及! –

1
在此resArr
var initialArr = [ 
        {"a1" : "a1Val", "a2" : "a2Val", "a3" : "a3Val"}, 
        {"b1" : "b1Val", "b2" : "b2Val", "b3" : "b3Val"}, 
        {"z1" : "z1Val", "z2" : "z2Val", "z3" : "z3Val"} 
       ]; 

var resArr = initialArr.map(function(x){ 
    return x[Object.keys(x)[1]]; 
}); 

在這裏,我將其映射到initialArr [],以產生陣列出它稱爲resArr和每個元素initialArr被表示爲 'X'在這個x是一個對象現在inorde獲得對象x [1]的第二個元素,所以在這裏,1代表第二個元素作爲索引從0,1 ,,,,所以我們需要通過Object獲取該對象的鍵.keys(x)的[1] ...因此值將是x [Object.keys(x)[1]]。

+0

請添加更詳細的解釋 - http://stackoverflow.com/help/how-to-answer –

+0

罰款,但直接在你的答案不在評論。 –