首页 > 解决方案 > 在 javascript 中过滤和循环非数组平面 JSON 对象

问题描述

我有以下 JSON,我将其用作 javascript 的某种枚举等效项:

const blah = {
    IV: {
        name: "dIV",
        value: 1
    },
    III: {
        name: "dIII",
        value: 2
    },
    II: {
        name: "dII",
        value: 3
    },
    I: {
        name: "dI",
        value: 4
    }
};

我想过滤所有对象value,然后能够遍历结果。我试图做类似的事情:

let result = blah.find(x => x.value > 2);
result.each(function () {
   console.log(this)
}

但这不起作用并抛出:blah.find is not a function. 预期的输出将包含两个元素:

II: { name: "dII", value: 3},
I: { name: "dI", value: 4}

我在 Internet 上找到的大多数示例都使用 JSON 结构中的数组。是否有任何选项可以实现我想要的,或者我需要修改 JSON 结构并使用数组?干杯

标签: javascriptjson

解决方案


您可以使用循环遍历每个对象键(可枚举属性)的简单方法来迭代您的对象(注意,它是 javascript 文字对象,而不是 JSON)for...in,对我来说,这是最可控和可读的方式,但是有很多更多,正如您在其他人的答案中看到的那样。

const blah = {IV: {name: "dIV", value: 1}, III: {name: "dIII", value: 2}, II: { name: "dII",    value: 3}, I: {name: "dI", value: 4}};

let result = []
for (let key in blah){
  let object = blah[key]
  if (object.value > 2){
    result.push(object)  
  }
}

console.log(result)

另一种可能性是使用Object.values(将对象中的所有值返回到数组中)
Array.filter(顾名思义),这是更少的代码和更“优雅”:

const blah = {IV: {name: "dIV", value: 1}, III: {name: "dIII", value: 2}, II: { name: "dII",    value: 3}, I: {name: "dI", value: 4}};

let result = Object.values(blah).filter(x => x.value > 2)
console.log(result)


推荐阅读