如何查找 JSON 对象是否包含数字并返回它们?

Tum*_*ums 2 javascript json

假设我有一个对象,它来自dataset动态随机。我想搜索并对该对象的数值进行一些操作(如果有的话)。我可以通过Object使用简单的 for..of循环遍历并获取整个键,但我不确定如何遍历对象中的每个键值对并返回数字。下面给出一个例子:

var obj = {
  "a0": {
    "count": 41,
    "name": "Park",

  },
  "a1": {
    "count": 52,
    "name": "Greg",

  },

  "a2": {
    "count": 150,
    "name": "Sylvain",

  },
  "a3": {
    "count": 276,
    "name": "Macho",

  },
  "a4": {
    "count": 36,
    "name": "Mariam",

  },
  "a5": {
    "count": 39,
    "name": "Blanca",

  }

}
Run Code Online (Sandbox Code Playgroud)

我可以循环遍历它如下:

for (let i of Object.keys(obj)) {
  console.log(obj[i]);
}
Run Code Online (Sandbox Code Playgroud)

Object除了 hasOwnProperty 和 之外keys,我找不到任何其他属性,这些属性实际上可以为我提供值。我可以通过执行 简单地访问计数的值obj[i].count,但我不知道它是否有计数。我正在寻找一种通用方法来获取值并检查其类型并将它们作为数组返回或对数字值进行一些操作。

编辑:我正在寻找在对象中提取具有数值的属性。

任何人都可以帮我解决这个问题。

谢谢你。

Ori*_*ori 6

使用Object.keys(),并使用Array.map()迭代键数组。在地图中使用Array.reduce()来获取具有数值的属性:

创建一个数字数组:

const obj = {"a0":{"count":41, "demo": 15, "name":"Park"},"a1":{"count":52, "demo": 53, "name":"Greg"},"a2":{"count":150,"name":"Sylvain"},"a3":{"count":276,"name":"Macho"},"a4":{"count":36,"name":"Mariam"},"a5":{"count":39,"name":"Blanca"}};

const result = Object.keys(obj).map((key) => {
  const o = obj[key];
  
  return Object.keys(o).reduce((r, k) => typeof o[k] === 'number' ?
    Object.assign(r, { [k]: o[k] }) : r , {});
});

console.log(result);
Run Code Online (Sandbox Code Playgroud)

如果目标浏览器支持,您可以使用Object.value()Object.entries()将其缩短一点:

const obj = {"a0":{"count":41, "demo": 15, "name":"Park"},"a1":{"count":52, "demo": 53, "name":"Greg"},"a2":{"count":150,"name":"Sylvain"},"a3":{"count":276,"name":"Macho"},"a4":{"count":36,"name":"Mariam"},"a5":{"count":39,"name":"Blanca"}};

const result = Object.values(obj).map((o) =>
  Object.entries(o).reduce((r, [k, v]) => typeof v === 'number' ?
    Object.assign(r, { [k]: v }) : r , {})
);

console.log(result);
Run Code Online (Sandbox Code Playgroud)

如果可以使用Object.fromEntries(),则可以使用Array.filter()删除值不是数字的属性,然后使用Object.fromEntries()以下方法将其转换回对象:

const obj = {"a0":{"count":41, "demo": 15, "name":"Park"},"a1":{"count":52, "demo": 53, "name":"Greg"},"a2":{"count":150,"name":"Sylvain"},"a3":{"count":276,"name":"Macho"},"a4":{"count":36,"name":"Mariam"},"a5":{"count":39,"name":"Blanca"}};

const result = Object.values(obj)
  .map((o) => Object.fromEntries(
    Object
      .entries(o)
      .filter(([,v]) => typeof v === 'number')
  ))

console.log(result);
Run Code Online (Sandbox Code Playgroud)