javascript - 从json对象中提取数组

时间:2015-01-09 14:24:39

标签: javascript arrays json performance algorithm

假设我们有以下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"}] 

在最佳表现中。

密钥不必包含数字。

我需要的是一个能够接收参数的函数 - i 并返回原始json对象中所有第i个对象的数组

例如,如果我们看一下上面的json对象 我们调用方法将返回的方法

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

希望它足够清楚。

7 个答案:

答案 0 :(得分:5)

您可以在这里使用Array.map

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

您正在做的是获取第二个密钥,然后返回具有该密钥和值的新对象。

答案 1 :(得分:2)

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]];
});

jsFiddle Demo

在这个resArr中,我将它映射到initialArr [],以生成一个名为resArr的数组,并且每个元素initialArr在此x中表示为'x',现在是一个对象以获取第二个元素对象x [1]所以这里,1代表第二个元素,因为索引从0,1 ,,,所以我们需要通过Object.keys(x)[1]得到该对象的键...因此值将是x [Object.keys(x)[1]]。

答案 2 :(得分: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;
             });

在控制台中运行此操作并查看。

答案 3 :(得分:1)

您可能会发现在使用reviver函数解析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)));

答案 4 :(得分:0)

在阵列上执行forEach循环。然后为每个值获取带有正则表达式的键。 (Loop through object get value using regex key matches Javascript)。 我不会给你完整的代码,因为它很容易实现,这是一个很好的学习经验。

答案 5 :(得分:0)

转换为数组,映射键,过滤结果,连接所有等等。 这应该适合你:

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

答案 6 :(得分: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);
  }
}