如何在嵌套对象数组中找到特定键的所有值?

时间:2020-09-01 05:12:55

标签: javascript arrays json object nested

如何在嵌套对象数组中找到特定键的所有值?

示例数据:

[
  {
    "id": 14252373,
    "name": "foo",
    "url": "/test",
    "private": true,
    "owner": {
        "login": "username",
        "id": 1217786,
    },
    "permissions": {
        "admin": {
            "id": 1567283
        },
        "push": false,
        "pull": true
        }
  }
]

如何获取所有id值的数组?

所需的输出: [14252373, 1217786, 1567283]

5 个答案:

答案 0 :(得分:0)

您可以创建一个函数并遍历传递的对象中的键。如果当前键与要查找的键相同,则将值添加到输出中。如果当前键是一个对象,则以当前值递归调用该函数

function getValue(o, findKey) {
  const output = []
  
  for (const k in o) {
    if (k === findKey)
      output.push(o[k])
    else if (typeof o[k] === 'object')
      output.push(...getValue(o[k], findKey))
  }
  
  return output;
}

getValue(input, 'id')

这是一个片段:

const input = [{
  "id": 14252373,
  "name": "foo",
  "url": "/test",
  "private": true,
  "owner": {
    "login": "username",
    "id": 1217786,
  },
  "permissions": {
    "admin": {
      "id": 1567283
    },
    "push": false,
    "pull": true
  }
}]

function getValue(o, findKey) {
  const output = []
  
  for (const k in o) {
    if (k === findKey)
      output.push(o[findKey])
    else if (typeof o[k] === 'object')
      output.push(...getValue(o[k], findKey))
  }
  
  return output;
}

console.log(getValue(input, 'id'))

答案 1 :(得分:0)

有多种方法可以实现此目的。一种有趣的方法是将结构转换为JSON并使用正则表达式提取ID:

let ary = 
[
  {
    "id": 14252373,
    "name": "foo",
    "url": "/test",
    "private": true,
    "owner": {
        "login": "username",
        "id": 1217786,
    },
    "permissions": {
        "admin": {
            "id": 1567283
        },
        "push": false,
        "pull": true
        }
  }
];

let json = JSON.stringify(ary);
let idMatcher = /(?<="id":\s*)\d+/gmu;
let ids = json.match(idMatcher);

console.log(ids);

答案 2 :(得分:0)

您可以使用reducerecursive函数。在reduce回调内部检查迭代中的当前项目是否是对象,如果是,则调用递归函数

let data = [{
  id: 14252373,
  name: "foo",
  url: "/test",
  private: true,
  owner: {
    login: "username",
    id: 1217786
  },
  permissions: {
    admin: {
      id: 1567283
    },
    push: false,
    pull: true
  }
}];

let ids = data.reduce((acc, curr) => {
  for (let keys in curr) {
    if (keys === "id") {
      acc.push(curr[keys]);
    } else if (typeof curr[keys] === "object" && curr[keys] !== null) {
      acc = recurObj(curr[keys], acc);
    }
  }
  return acc;
}, []);

function recurObj(val, arr) {
  for (let keys in val) {
    if (keys === "id") {
      arr.push(val[keys]);
    } else if (typeof val[keys] === "object" && val[keys] !== null) {
      recurObj(val[keys], arr);
    }
  }
  return arr;
}
console.log(ids);

答案 3 :(得分:0)

由于它是一个对象数组,因此我认为简单的forEach会使其变得非常简单:

let data = [{
  id: 14252373,
  name: "foo",
  url: "/test",
  private: true,
  owner: {
    login: "username",
    id: 1217786
  },
  permissions: {
    admin: {
      id: 1567283
    },
    push: false,
    pull: true
  },
},
{
  id: 222222222,
  name: "foo",
  url: "/test",
  private: true,
  owner: {
    login: "username",
    id: 1217786
  },
  permissions: {
    admin: {
      id: 1567283
    },
    push: false,
    pull: true
  },
},

];

let everyID = [];

data.forEach(item => {
  everyID.push(item.id);
});

console.log(everyID);

答案 4 :(得分:0)

我们现在使用object-scan来进行所有这样的数据处理。一旦将头放在如何使用上,它就会非常强大。这是您回答问题的方式

const objectScan = require('object-scan');

const find = (input) => objectScan(['**.id'], { rtn: 'value' })(input);

const arr = [{
  id: 14252373,
  name: 'foo',
  url: '/test',
  private: true,
  owner: {
    login: 'username',
    id: 1217786
  },
  permissions: {
    admin: {
      id: 1567283
    },
    push: false,
    pull: true
  }
}];

console.log(find(arr));
// => [ 1567283, 1217786, 14252373 ]