【问题标题】:Extract only values from JSON object in javascript without using a loop仅从 javascript 中的 JSON 对象中提取值而不使用循环
【发布时间】:2017-05-04 10:48:55
【问题描述】:

是否有一种“好”的方式从 json 对象中获取所有值(我不关心键) - 只需将值放入数组中, 不使用循环? (语言是 Javascript)

【问题讨论】:

  • 你为什么不想要一个循环?没有循环你可以试试this
  • 谢谢,现在有点早了 - 我想几个月后这将是正确的答案 :-)

标签: javascript json


【解决方案1】:

递归提取为文本

是的,这是一个循环,但您调用的底层方法(例如 Object.valuesarr.map 仍然是循环)。我发现这对于从 json 对象中提取文本以进行全文搜索特别有用,并认为它很有用,因为我来到这里最初需要这个,但答案只触及表面,因为 json 本质上是递归的

function textFromJson(json) {
    if (json === null || json === undefined) {
      return '';
    }
    if (!Array.isArray(json) && !Object.getPrototypeOf(json).isPrototypeOf(Object)) {
      return '' + json;
    }
    const obj = {};
    for (const key of Object.keys(json)) {
        obj[key] = textFromJson(json[key]);
    }
    return Object.values(obj).join(' ');
}

【讨论】:

    【解决方案2】:

    在 ES2017 中,您拥有 Object.values()。你可以polyfill it also

    您只需要将 JSON 转换为 JavaScript 对象并调用 Object.values()。结果是一个值数组。

    var obj = JSON.parse(jsonData);
    var result = Object.values(obj);
    

    【讨论】:

    • 我猜它还不可用...?
    • 此提案处于第 4 阶段。如果您使用 Typescript 或 Babel,您可以使用它并将您的代码转换为 ES5 javascript。否则,如果你包含你应该能够在你的代码中使用的 polyfill。
    【解决方案3】:

    这取决于你如何定义“循环”。

    您可以使用Object.keys 提取属性,然后将map 提取到它们的值。

    …尽管如此,它本质上仍然是一个循环。

    var json = `{ "foo": 1, "bar": 2, "baz": 3 }`;
    var obj = JSON.parse(json);
    var values = Object.keys(obj).map(function (key) { return obj[key]; });
    console.log(values);

    如果浏览器支持较弱,您可以使用values 方法。

    var json = `{ "foo": 1, "bar": 2, "baz": 3 }`;
    var obj = JSON.parse(json);
    var values = Object.values(obj);
    console.log(values);

    【讨论】:

    • 谢谢 - 这就是我想要的。显然,引擎盖下会出现一个循环,只是希望源看起来更小。
    • Object.values 现在有 94% 的浏览器支持:caniuse.com/object-values
    【解决方案4】:

    我认为您正在寻找 Object.values() 函数,只需将对象作为第一个参数传递给 Object 的 values 方法。就是这样!

    Object.values({something: 'lol'});
    > ["lol"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2022-10-21
      • 1970-01-01
      • 2012-12-14
      相关资源
      最近更新 更多