【问题标题】:javascript - extract array from json objectjavascript - 从 json 对象中提取数组
【发布时间】:2015-01-09 14:24:39
【问题描述】:

假设我们有以下 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 对象 然后我们调用我们 2 方法将返回的方法

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

希望它足够清楚。

【问题讨论】:

  • 您的结果不是有效的数组。你想要一个对象吗({"a2":"a2Val","b2":"b2Val"...});对象数组 ([{"a2":"a2Val"},{"b2":"b2Val"}...]) 还是其他?
  • 这是您数据的实际格式吗?你会一直有一个直通z吗?
  • 我想你的意思是你想要一本只包含指定对的字典?问题是字典没有排序。键实际上包含数字吗?
  • @Paul Roub ,我想要一个对象数组。我会更新问题
  • @SanjayManohar,密钥不必包含数字..

标签: javascript arrays json performance algorithm


【解决方案1】:

你可以在这里使用Array.map

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

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

【讨论】:

  • 和你有同样的想法,但你的解决方案更棒。该死,我喜欢你在退货声明中使用, 的方式!
  • @Qwerty 啊!您是第一个欣赏使用逗号运算符的人。谢谢你:)
  • @AmitJoki,谢谢,这是我看到的最优雅的方式。我会用你的方式!
  • @johnSmith 很高兴为您提供帮助 :)
【解决方案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]]。

【讨论】:

【解决方案3】:

只是一种非常奇特的方式来完全按照您的要求进行操作。稍作调整后适用于任何东西

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

在控制台中运行它并查看。

【讨论】:

    【解决方案4】:

    您可能会发现在使用 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)));

    【讨论】:

    • 我也想要你的答案!
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      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.

      【讨论】:

        【解决方案7】:

        这个呢:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-22
          • 2019-09-20
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 2015-03-27
          • 1970-01-01
          相关资源
          最近更新 更多