iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >替换json对象中的key的解决方案
  • 201
分享到

替换json对象中的key的解决方案

2023-06-15 07:06:55 201人浏览 独家记忆
摘要

本篇文章和大家了解一下替换JSON对象中的key的解决方案。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。jsON(javascript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基

本篇文章和大家了解一下替换JSON对象中的key的解决方案。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

jsON(javascript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

  看到标题你可能会想,如此简单的问题值得去探究吗?如果我有一个json object,只需下面简单的几行代码就可以完成:

var obj = {    "_id": "5078c3a803ff4197dc81fbfb",    "email": "user1@gmail.com",    "image": "some_image_url",    "name": "Name 1"};var new_key = "id";var old_key = "_id";obj[new_key] = obj[old_key];delete obj[old_key];

  是的,没错!以上代码可以很好地完成工作,从而将obj对象中的"_id"替换成"id"。

  在大多数情况下,这种方式不会带来什么问题,但是,如果你需要将obj对象序列化到文档中并比较差异,你就会看到问题。

// 修改之前的obj{    "_id": "5078c3a803ff4197dc81fbfb",    "email": "user1@gmail.com",    "image": "some_image_url",    "name": "Name 1"}// 修改之后的obj // JSON.stringify(obj, null, "\t"){    "email": "user1@gmail.com",    "image": "some_image_url",    "name": "Name 1",    "id": "5078c3a803ff4197dc81fbfb"}

  新添加的key默认放在了最后,并且由于在替换过程中我们删除了之前的key,所以导致序列化之后的obj与之前的obj存在较大的差异。

替换json对象中的key的解决方案

  那如何才能保证在最小差异的情况下实现key的替换呢?下面是我找到的一些方法:

Object.prototype.renameProperty = function (oldName, newName) {     // Do nothing if the names are the same     if (oldName === newName) {         return this;     }    // Check for the old property name to avoid a ReferenceError in strict mode.    if (this.hasOwnProperty(oldName)) {        this[newName] = this[oldName];        delete this[oldName];    }    return this;};
function renameKeys(obj, newKeys) {  const keyValues = Object.keys(obj).map(key => {    const newKey = newKeys[key] || key;    return { [newKey]: obj[key] };  });  return Object.assign({}, ...keyValues);}const obj = { a: "1", b: "2" };const newKeys = { a: "A", c: "C" };const renamedObj = renameKeys(obj, newKeys);console.log(renamedObj);// {A:"1", b:"2"}
// 使用lodash的_.mapKeys()函数var user = {  name: "Andrew",  id: 25,  reported: false};var renamed = _.mapKeys(user, function(value, key) {  return key + "_" + user.id;});console.log(renamed);
var str = JSON.stringify(object);str = str.replace(/oldKey/g, 'newKey');str = str.replace(/oldKey2/g, 'newKey2');object = JSON.parse(str);
function renameObjecTKEy(oldObj, oldName, newName) {    const newObj = {};    Object.keys(oldObj).forEach(key => {        const value = oldObj[key];        if (key === oldName) {            newObj[newName] = value;        } else {            newObj[key] = value;        }    });    return newObj;}
data = {key1: "value1", key2: "value2", key3: "value3"}; keyMap = {key1: "firstkey", key2: "secondkey", key3: "thirdkey"};mappedData = Object.keys(keyMap).reduce((obj,k) => Object.assign(obj, { [keyMap[k]]: data[k] }),{});console.log(mappedData);

  上面这些例子有一部分可以达到我们的要求,另外有一部分和本文开头给出的代码基本等效(只是在执行效率上略有差别)。但所有这些示例无一例外都不能同时满足下面两个要需:

保留要替换的key在原json对象中的顺序。既保证在JSON.stringify()执行之后输出的字符串中key的顺序和原json对象是一致的。在原json对象上进行修改,而不是返回一个新的json对象。某些情况下,我们需要对一个复杂json对象的子元素进行修改,如果修改之后返回一个新的json对象,则无法保证这个新的对象会反应到原json对象中。例如,jspath是一个可以通过domain-specific language (DSL)在给定的json对象中查找子元素的javascript库,通过下面的代码我们可以轻易地查找出obj对象中automobiles属性中maker === "Honda"并且year > 2009的元素。

var obj = {    "automobiles" : [        { "maker" : "Nissan", "model" : "Teana", "year" : 2011 },        { "maker" : "Honda", "model" : "Jazz", "year" : 2010 },        { "maker" : "Honda", "model" : "Civic", "year" : 2007 },        { "maker" : "Toyota", "model" : "Yaris", "year" : 2008 },        { "maker" : "Honda", "model" : "Accord", "year" : 2011 }    ],    "motorcycles" : [{ "maker" : "Honda", "model" : "ST1300", "year" : 2012 }]};var res = JSPath.apply('.automobiles{.maker === "Honda" && .year > 2009}', obj);// res: [{ "maker" : "Honda", "model" : "Jazz", "year" : 2010 }, { "maker" : "Honda", "model" : "Accord", "year" : 2011 }]

  注意这里返回的res对象是obj对象的一部分,意味着后续对res对象所做的任何修改都会反应到obj对象中。如果我们对res中的某些key进行替换,而返回一个新json对象的话,那么这个修改就不会反应到obj对象中。

  基本思路:既然新添加的key默认都会排在最后,那么索性遍历json对象的所有key,然后将key一一替换为一个临时名称,随后再将这个临时名称替换回来。在这个过程中,如果遇到真正需要替换的key,则不再进行二次替换。下面是具体的代码:

var obj = {    "_id": "5078c3a803ff4197dc81fbfb",    "email": "user1@gmail.com",    "image": "some_image_url",    "name": "Name 1"};var new_key = "id";var old_key = "_id";Object.keys(obj).forEach(key => {    if (key === old_key) {        obj[new_key] = obj[key];        delete obj[key];    } else {        obj[`_${key}`] = obj[key];        delete obj[key];        obj[`${key}`] = obj[`_${key}`];        delete obj[`_${key}`];    }});

  完成之后的效果如下图:

替换json对象中的key的解决方案

  当然,如果考虑通用性,可能需要递归遍历给定的json对象。以上代码只是给出了一个思路,考虑到执行效率和安全性,这个并不是最佳方案,真实使用中我们可以逐步进行完善。

以上就是替换json对象中的key的解决方案的简略介绍,当然详细使用上面的不同还得要大家自己使用过才领会。如果想了解更多,欢迎关注编程网精选频道哦!

--结束END--

本文标题: 替换json对象中的key的解决方案

本文链接: https://www.lsjlt.com/news/278826.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 替换json对象中的key的解决方案
    本篇文章和大家了解一下替换json对象中的key的解决方案。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基...
    99+
    2023-06-15
  • 替换json对象中的key最佳方案
    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子...
    99+
    2024-04-02
  • 使用json对象转化为key,value的对象数组
    目录json对象转为key,value对象数组问题引出解决方式数组转换成json key-value形式eg1(数组中包含的是数组)eg2(数组中包含的是对象)json对象转为key...
    99+
    2024-04-02
  • js如何获取json对象的key值
    本篇内容主要讲解“js如何获取json对象的key值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js如何获取json对象的key值”吧!JavaScript 对象是由键值对创建的,也不像数组,...
    99+
    2023-06-26
  • Java将json对象转换为map键值对案例详解
      本文的目的是把json串转成map键值对存储,而且只存储叶节点的数据   比如json数据如下:   {responseHeader:{status:0,QTime:0},spe...
    99+
    2024-04-02
  • json对象和formData相互转换的方式详解
    目录前言常见的 POST 提交数据方式JSON 格式和 formData 格式的区别json 对象转 formDataformData 对象转 json前言 大家都知道,前端在和后台...
    99+
    2023-02-14
    json对象和formData相互转换 formData转换json
  • 如何使用json对象转化为key,value的对象数组
    这篇文章主要介绍“如何使用json对象转化为key,value的对象数组”,在日常操作中,相信很多人在如何使用json对象转化为key,value的对象数组问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使...
    99+
    2023-07-02
  • PHP 中数组转对象的替代方案有哪些?
    php 中数组转对象的替代方案有:类型强制转换:例如 $obj = (object) $arr;使用自定义类:定义一个类,并通过构造函数对属性进行赋值,例如 new person($ar...
    99+
    2024-04-29
    php 数组转对象 mysql 代码可读性
  • fastjson--对象与JSON之间的转换方法
    1、Java对象–>JSON对象: (JSONObject)JSONObject.toJSON(Java对象实例) public class JSON2JavaTest{ public static...
    99+
    2023-09-04
    json java
  • Java对象转换的方案分享
    目录前言为什么模型要分这么多层?模型之间的转换建议不要用的方式常用的方式使用方式定义对象BeanCopier最简单的使用方式创建可复用的BeanCopier工具类MapStruct引...
    99+
    2024-04-02
  • JSON 对象未定义错误的解决方法
    要解决 JSON 对象未定义的错误,可以尝试以下几种方法:1. 确保引入了正确的 JSON 库: 在 JavaScript 中,要操...
    99+
    2023-08-15
    JSON
  • java8 对象转Map时重复 key Duplicate key xxxx的解决
    目录java8 对象转Map时重复 key Duplicate key xxxx案例如下解决方案如下总结java8 toMap(key重复如何解决)1、当key重复,使用最后一个va...
    99+
    2024-04-02
  • JSON字符串转换为PHP对象的方法?
    JSON是一种轻量级的数据交换格式,常用于前后端数据传输。在PHP中,可以使用内置的json_decode()函数将JSON字符串转换为PHP对象。接下来,将介绍具体的方法及代码示例。...
    99+
    2024-04-02
  • Python面试中对象问题的完整解决方案
    Python是一种高级编程语言,被广泛应用于各种领域,从Web开发到数据科学,从人工智能到机器学习。因此,Python开发人员的需求量也越来越大,越来越多的人开始涉足这个领域。但是,在Python开发领域中,对象问题是一个常见的面试问题,面...
    99+
    2023-09-24
    面试 对象 教程
  • php中preg_replace替换失败的解决方法
    小编给大家分享一下php中preg_replace替换失败的解决方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!php preg_replace替换失败的解决办法:首先打开相应的PHP代码文件;然后将替换不了的字符,打印...
    99+
    2023-06-06
  • PHP替换文本常见问题解决方案!
    在PHP开发中,经常会遇到需要替换文本的情况,比如替换字符串中的特定字符、替换文本中的关键词等。然而,替换文本的过程中可能会遇到一些常见问题,本文将介绍这些常见问题,并给出相应的解决方...
    99+
    2024-04-02
  • nodejs将JSON字符串转化为JSON对象报错的解决方法
    这篇文章主要介绍“nodejs将JSON字符串转化为JSON对象报错的解决方法”,在日常操作中,相信很多人在nodejs将JSON字符串转化为JSON对象报错的解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-20
  • Jackson中json格式的字符串与对象的互相转换方式
    目录json格式的字符串与对象的互相转换Jackson 简介jackson特点json格式的字符串与对象的转换Jackson进行json转对象,对象转json总结JavaBean准备...
    99+
    2024-04-02
  • javascript实现json字符串与对象转换的方法
    这篇文章主要介绍“javascript实现json字符串与对象转换的方法”,在日常操作中,相信很多人在javascript实现json字符串与对象转换的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jav...
    99+
    2023-06-14
  • JSON数组和JSON对象在vue中的获取方法
    这两天在学习vue,主要是为了实现前后端的分离,因此数据的传输是必不可少的一个环节。 为了快速入门,参考了vue官网的视频,这个过程由于引入vue.js的问题走了一些弯路,这个我们以...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作