【问题标题】:parse json object array by index position按索引位置解析 json 对象数组
【发布时间】:2011-06-20 23:01:32
【问题描述】:

我正在解析一个 json 对象数组,以便如果 value = 'y',则键列表以逗号分隔列表的形式返回,该列表是一个将在 html 中返回的变量。

我想按索引位置引用键/值对,因为我只想返回键/值 #13-39 的值。

关于解决此问题的最佳方法有什么建议吗?

我已经有一个jquery map 函数来访问一些属性(即obj.address)。但是我无法成功地使用过滤器或 grep 来仅选择具有某些键名或索引位置的对象属性。

这是数组的样子:

[{"Name": "Name1", "Key1": "Y", "Key2": "Y", "Key3": "N", "Key4": "Y", "Key5": "N"},
{"Name": "Name2", "Key1": "N", "Key2": "Y", "Key3": "Y", "Key4": "N", "Key5": "N"},
{"Name": "Name3", "Key1": "N", "Key2": "Y", "Key3": "Y", "Key4": "Y", "Key5": "Y"}}

感谢您的帮助!

【问题讨论】:

  • 哪个值应该是“Y”?您在示例代码中提供了几个。为了以您表达的方式呈现数据,“Y”应该是什么?
  • 应该显示任何值为'y'的键。所以逗号分隔的列表将是,即数组中的第一个对象:“Key1,Key2,Key4”
  • 给定示例数组的预期输出是什么?应该是这样的:Name1: Key1, Key2, Key4; Name2: Key2, Key3; Name3: Key2, Key3, Key4, Key5
  • 每个名称/对象在 jquery mobile 中显示为单独的页面。这些页面是通过 jQuery 的 each 创建的。因此,键列表将与名称/对象的页面相关联,并可作为变量访问,即“键”,将在每个函数中格式化和显示。

标签: javascript jquery json parsing object


【解决方案1】:

我想您可以使用 jQuery 的$.map 找到一些方法来做到这一点,但我个人觉得以纯 JavaScript 方式更容易想到。 (请注意,如果您的键实际上并未命名为 "Key1""Key2" 等,但您希望通过它们在关联数组中的位置来访问这些键,则这没有可靠的跨浏览器实现。):

var bar = [
  {"Name": "Name1", "Key1": "Y", "Key2": "Y", "Key3": "N",
                    "Key4": "Y", "Key5": "N"},
  {"Name": "Name2", "Key1": "N", "Key2": "Y", "Key3": "Y",
                    "Key4": "N", "Key5": "N"},
  {"Name": "Name3", "Key1": "N", "Key2": "Y", "Key3": "Y",
                    "Key4": "Y", "Key5": "Y"}
];
var parsed = {}; // this contains the result
var MIN_KEY = 2; // set to 13 for your request
var MAX_KEY = 4; // set to 39 for your request

for (var i = 0, iLen = bar.length; i < iLen; i++) {
  var baz = bar[i];
  var name;
  var temp = [];
  for (var key in baz) {
    var keyNum = parseInt(key.replace("Key", ""));

    // Get the name or add valid key to an array
    if (key === "Name") {
      name = baz[key];
    } else if (baz[key] === "Y" && keyNum >= MIN_KEY && keyNum < MAX_KEY) {
      temp.push(key);
    }
  }

  // Concatenates temp array like "Key1, Key2, Key3"
  parsed[name] = temp.join(", ");
}

console.log(bar);
console.log(parsed);

通过计算键的替代实现(请注意,这在浏览器中可能不可靠):

for (var i = 0, iLen = bar.length; i < iLen; i++) {
  var counter = 0;
  var baz = bar[i];
  var name;
  var temp = [];
  for (var key in baz) {
    if (key === "Name") {
      name = baz[key];
    } else if (baz[key] === "Y" && counter >= MIN_KEY && counter < MAX_KEY) {
      temp.push(key);
    }
    counter++;
  }
  parsed[name] = temp.join(", ");
}

【讨论】:

  • 好的 - 是的 - 它们实际上并没有命名为 Key1、Key2 等。所以没有可靠的跨浏览器方法来通过索引位置访问它们?
  • 并非如此。 Here's some more info. 您可以使用上面的 for 循环并使用计数器变量(请参阅我上面的编辑),然后根据需要进行测试,请记住,没有真正的标准,事情可能无法正常工作。跨度>
  • 好的 - 非常感谢这个链接。我想知道为什么事情似乎总是半随机地回来……现在我知道了。非常感谢您的帮助。
猜你喜欢
  • 2014-07-26
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多