【问题标题】:Extract items from a json file with values in an array从具有数组值的 json 文件中提取项目
【发布时间】:2019-06-12 17:54:11
【问题描述】:

我正在尝试处理 JSON 数组以从用户选择的可用键中提取键值对。

这不是实时 json 示例...只是一个示例

JSON 示例

var personnel = [
  {
    id: 5,
    name: "Luke Skywalker",
    pilotingScore: 98,
    shootingScore: 56,
    isForceUser: true,
  },
  {
    id: 82,
    name: "Sabine Wren",
    pilotingScore: 73,
    shootingScore: 99,
    isForceUser: false,
    skills:{
      'skill1':'vision',
      'skill2':'strength'  
    }
  },
  {
    id: 22,
    name: "Zeb Orellios",
    pilotingScore: 20,
    shootingScore: 59,
    isForceUser: false,
  },
  {
    id: 15,
    name: "Ezra Bridger",
    pilotingScore: 43,
    shootingScore: 67,
    isForceUser: true,
    skills:{
      'skill1':'vision',
      'skill2':'strength'
    }
  },
  {
    id: 11,
    name: "Caleb Dume",
    pilotingScore: 71,
    shootingScore: 85,
    isForceUser: true,
  },
];




      sample_arr = [id,name,skills.skill1];

      let op = personnel.map(md => {
             return { id: md.id,name:md.name,skills{skill1:md.skills.skill1}};
       });

         console.log(JSON.stringify(op,null,2))

我想得到如下的键值对。

[
  {
    "id": 5,
    "name": "Luke Skywalker"
  },
  {
    "id": 82,
    "name": "Sabine Wren",
     "skills":{
         "skill1": 'vision'
       }
  },
  {
    "id": 22,
    "name": "Zeb Orellios"
  },
  {
    "id": 15,
    "name": "Ezra Bridger"
  },
  {
    "id": 11,
    "name": "Caleb Dume"
  }
]

我现在更新了我的问题陈述。

要求:

将用户选择的所有 JSON 值提取到一个新数组中。这将节省更多时间,因为 json 一直是 700MB,处理每个请求都非常耗时

【问题讨论】:

  • 请使用代码标签编辑问题。这将使它对其他人可读。

标签: javascript arrays dictionary filter reduce


【解决方案1】:

您将用户选择存储在数组中吗?如果是这样,您可以执行以下操作:

let sample_arr = ['id', 'name']

let op = personnel.map(md => {
    let user = {}
    sample_arr.forEach(val => {
        if (md[val]) {
            user[val] = md[val]
        }
    })
    return user
})

【讨论】:

  • 谢谢。如果我想显示像技能这样的嵌套数组值,我该如何进入下一个级别
  • @Kiran:你能用这些更新的要求更新问题,或者问一个新问题吗?目前尚不清楚您在寻找什么。显然,如果将 skills 添加到列表中,则此答案或我的答案将包含 skills 属性。你想用更深层次的价值观做什么?你的 API 是什么?
【解决方案2】:

这是一个简单的函数:

const project = (keys) => (xs) =>
  xs .map (x => keys .reduce ( (a, k) => ({...a, [k]: x[k]}), {} ))

var personnel = [{id:5,name:"Luke Skywalker",pilotingScore:98,shootingScore:56,isForceUser:true},{id:82,name:"Sabine Wren",pilotingScore:73,shootingScore:99,isForceUser:false,skills:{skill1:"vision",skill2:"strength"}},{id:22,name:"Zeb Orellios",pilotingScore:20,shootingScore:59,isForceUser:false},{id:15,name:"Ezra Bridger",pilotingScore:43,shootingScore:67,isForceUser:true,skills:{skill1:"vision",skill2:"strength"}},{id:11,name:"Caleb Dume",pilotingScore:71,shootingScore:85,isForceUser:true}];

console .log (
  project (['id', 'name']) (personnel)
)

project 这个名字来自 Codd 早期关于关系数据库的论文;它的感觉类似于 SQL 的 select 语句。

更新

KellyKapoor 的答案有一个上面缺少的特性:它只包含数据有的属性名称(所以没有skills: undefined。)

不清楚 OP 正在寻找哪种行为,但这个小修改提供了该功能

const project2 = (keys) => (xs) =>
  xs .map (x => keys .reduce ((a, k) => ({...a, ...(k in x ? {[k]: x[k]} : {}) }), {} ))

var personnel = [{id:5,name:"Luke Skywalker",pilotingScore:98,shootingScore:56,isForceUser:true},{id:82,name:"Sabine Wren",pilotingScore:73,shootingScore:99,isForceUser:false,skills:{skill1:"vision",skill2:"strength"}},{id:22,name:"Zeb Orellios",pilotingScore:20,shootingScore:59,isForceUser:false},{id:15,name:"Ezra Bridger",pilotingScore:43,shootingScore:67,isForceUser:true,skills:{skill1:"vision",skill2:"strength"}},{id:11,name:"Caleb Dume",pilotingScore:71,shootingScore:85,isForceUser:true}];

console .log (
  project2 (['id', 'name', 'skills']) (personnel)
)

【讨论】:

    【解决方案3】:

    这有什么问题?

    let op = personnel.map(md => {
       return { id: md.id,name:md.name};
    });
    

    【讨论】:

    • Id 和 name 来自数组...Kelly Kapoor 的答案很好..但我不能去嵌套数组中的下一级
    • 如果这是我们想要的,那么解构可能会更简单:personnel.map(({id, name}) => ({id, name}))。
    【解决方案4】:

    您可以创建一个函数,该函数根据传递的键数组从对象中提取道具:

    var data = [ { id: 5, name: "Luke Skywalker", pilotingScore: 98, shootingScore: 56, isForceUser: true, }, { id: 82, name: "Sabine Wren", pilotingScore: 73, shootingScore: 99, isForceUser: false, skills:{ 'skill1':'vision', 'skill2':'strength' } }, { id: 22, name: "Zeb Orellios", pilotingScore: 20, shootingScore: 59, isForceUser: false, }, { id: 15, name: "Ezra Bridger", pilotingScore: 43, shootingScore: 67, isForceUser: true, skills:{ 'skill1':'vision', 'skill2':'strength' } }, { id: 11, name: "Caleb Dume", pilotingScore: 71, shootingScore: 85, isForceUser: true, }, ];
    
    let pick = (obj, fields) => Object.keys(obj)
      .reduce((r,c) => (fields.includes(c) ? r[c] = obj[c] : null, r), {})
    
    let result = data.map(x => pick(x, ['id', 'name', 'skills']))
    
    console.log(result)

    那么你需要做的就是通过 Array.map 从所有对象循环到pick。

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2022-01-12
      相关资源
      最近更新 更多