【问题标题】:trim JS object to remove extra params with curly braces修剪 JS 对象以删除带有花括号的额外参数
【发布时间】:2020-02-01 02:37:57
【问题描述】:

我这里有一个对象响应

result.joblist = {
  "collection_job_status_list": [
    {
      "application_context": {
        "application_id": "a4",
        "context_id": "c4"
      },
      "creation_time": "15699018476102",
      "progress": 100,
      "status": "READY",
      "phase": "ACTIVE",
      "job_error": {}
    },
    {
      "application_context": {
        "application_id": "a6",
        "context_id": "c6"
      },
      "creation_time": "15698648632523",
      "progress": 100,
      "status": "READY",
      "phase": "ACTIVE",
      "job_error": {}
    }
  ],
  "result": {
    "request_result": "ACCEPTED",
    "error": {}
  }
}

这里需要去掉{"application_context": & ending },只需要同级的application_id":"a4","context_id":"c4"

我尝试过类似的方法,但无法继续前进。

var newObj: any = {};
if (allJobs && allJobs.length > 0) {
  // this.rowData = this.allJobs;
  // this.allJobs = this.allJobs['application_id'];
  //let ele:object = allJobs.application_context;
  allJobs.forEach(ele => {
    newObj = {
      application_id: ele.application_context.application_id,
      context_id: ele.application_context.application_context
    };
    return newObj;
  });
}

【问题讨论】:

  • var newObj:any = {}; if (allJobs && allJobs.length > 0 ) { // this.rowData = this.allJobs; // this.allJobs = this.allJobs['application_id']; //let ele:object = allJobs.application_context; allJobs.forEach(ele => { newObj = {"application_id":ele.application_context.application_id, "context_id":ele.application_context.application_context} return newObj; }); }
  • 你的预期输出是什么,你能更新一下吗?我们是否需要从对象中删除 application_context 属性并且那些内部属性想要在根对象中?
  • 是的,想保持其他人一样

标签: javascript arrays typescript ecmascript-6


【解决方案1】:

你需要使用map函数

const result = {};
result.joblist = {
  "collection_job_status_list": [
    {
      "application_context": {
        "application_id": "a4",
        "context_id": "c4"
      },
      "creation_time": "15699018476102",
      "progress": 100,
      "status": "READY",
      "phase": "ACTIVE",
      "job_error": {}
    },
    {
      "application_context": {
        "application_id": "a6",
        "context_id": "c6"
      },
      "creation_time": "15698648632523",
      "progress": 100,
      "status": "READY",
      "phase": "ACTIVE",
      "job_error": {}
    }
  ],
  "result": {
    "request_result": "ACCEPTED",
    "error": {}
  }
}


result.joblist.collection_job_status_list = result.joblist.collection_job_status_list.map(item => {
  return {
     "application_id": item.application_context.application_id,
     "context_id": item.application_context.context_id
  }
})

console.log(result)

或者你可以使用 map 函数和简写的 es6 语法

const result = {};
result.joblist = {
  "collection_job_status_list": [
    {
      "application_context": {
        "application_id": "a4",
        "context_id": "c4"
      },
      "creation_time": "15699018476102",
      "progress": 100,
      "status": "READY",
      "phase": "ACTIVE",
      "job_error": {}
    },
    {
      "application_context": {
        "application_id": "a6",
        "context_id": "c6"
      },
      "creation_time": "15698648632523",
      "progress": 100,
      "status": "READY",
      "phase": "ACTIVE",
      "job_error": {}
    }
  ],
  "result": {
    "request_result": "ACCEPTED",
    "error": {}
  }
}


result.joblist.collection_job_status_list = result.joblist.collection_job_status_list.map(({application_context}) => {
  return {
     ...application_context
  }
})

console.log(result)

编辑:

您想要保留在数组中的内容取决于您从map 返回的内容。您返回要保留的密钥。所以如果你想要其他物品。

如果你有一个数组 A

A = [
  {
    nest: {
      x: 1,
      y: 1,
    },
    key1: 5,
    key2: 7,
  },
  {
    nest: {
      x: 1,
      y: 1,
    },
    key1: 5,
    key2: 7,
  },
  {
    nest: {
      x: 1,
      y: 1,
    },
    key1: 5,
    key2: 7,
  }
]

让我们假设您希望在最终输出中使用 nestkey1key2 中的 x。然后你会做

const finalOutput = A.map(item => {
  return {
     x: item.nest.x, // x from nest
     key1: item.key1, // key1
     key2: item.key2,  // key2
  }
})

但是有一些速记形式可以做到这一点。假设我们在map function 中得到的item 已经分为nestrest 变量。 nest 包含 item.nestrest{key1: 5,key2:7},然后您可以简单地从 nest 返回 x 以及从 rest 返回其他所有内容

const finalOutput = A.map(({nest, ...rest}) => {
  return {
     x: nest.x, // x from nest
     ...rest, // everything else
  }
})

【讨论】:

  • 看起来不错,谢谢!如何保持其他项目原样(如同一级别的其他项目)以及 ...application_context
【解决方案2】:

您可以使用mapdestructuring

  • 从结果中获取collection_job_status_list
  • 遍历值从application_context键中取出所需的值并与剩余值合并
  • 构建与原始结果相同的结构

let result = {"collection_job_status_list": [{"application_context": {"application_id": "a4","context_id": "c4"},"creation_time": "15699018476102","progress": 100,"status": "READY","phase": "ACTIVE","job_error": {}},{"application_context": {"application_id": "a6","context_id": "c6"},"creation_time": "15698648632523","progress": 100,"status": "READY","phase": "ACTIVE","job_error": {}}],"result": {"request_result": "ACCEPTED","error": {}}}

let { collection_job_status_list, ...rest } = result

let modified = collection_job_status_list.map(({
  application_context: {
    application_id,
    context_id
  },
  ...rest
}) => ({ ...rest, context_id, application_id}))

let final = {
  collection_job_status_list: modified,
  ...rest
}

console.log(final)

【讨论】:

【解决方案3】:

你需要的是一张地图。参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

尝试如下修改代码,您应该会得到预期的输出。

var newObj: any = {};
var newArray;
if (allJobs && allJobs.length > 0) {
  newArray = allJobs.map(ele => {
    newObj = {
      application_id: ele.application_context.application_id,
      context_id: ele.application_context.application_context
    };
    return newObj;
  });
}

希望这会有所帮助:)

【讨论】:

  • 嘿,谢谢,最好避免使用新变量或将结果存储在新对象中。
猜你喜欢
  • 1970-01-01
  • 2017-05-18
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多