首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何替换javascript对象中的每个ID实例

如何替换javascript对象中的每个ID实例
EN

Stack Overflow用户
提问于 2018-06-09 03:51:22
回答 3查看 69关注 0票数 -2

我正在尝试用一个随机的唯一ID值替换" ID“的每个实例。

有没有办法一次把它们全部替换掉?

My code:

代码语言:javascript
复制
var theobject = [
    {
    "id":"lol",
    "milk":[
            {
                "id":"lol",
                "waffle":[
                        {
                            "id":"lol",
                            "eggo":[]
                        }
                    ]
            },
            {
                "id":"lol",
                "cookies":[]
            }
        ]
    },
    {
    "id":"lol",
    "donut":[
            {
                "id":"lol",
                "cheeto":[]
            }
        ]
    }
];
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-09 04:16:18

尝试下面的方法,一个简单的递归解决方案,它将更新所有的id:

代码语言:javascript
复制
var theobject =[{"id":"lol","milk":[{"id":"lol","waffle":[{"id":"lol","eggo":[]}]},{"id":"lol","cookies":[]}]},{"id":"lol","donut":[{"id":"lol","cheeto":[]}]}];

function updateId(arr){
  for(var i = 0; i < arr.length;i++){
     Object.keys(arr[i]).forEach((key)=>{
        if(arr[i][key].constructor.toString().indexOf("Array") > -1)
           updateId(arr[i][key]);
     });
      if(arr[i].id)
        arr[i].id = Math.random().toString(36).slice(-8);
  }
}
updateId(theobject);
console.log(theobject);

票数 1
EN

Stack Overflow用户

发布于 2018-06-09 04:03:56

使用ramda帮助修改对象,使用cuid生成唯一ids:

代码语言:javascript
复制
const cuid = require('cuid')
const { evolve, map } = require('ramda')

const replaceIds = obj =>
  evolve({
    id: cuid,
    children: map(replaceIds)
  }, obj)

map(replaceIds, theobject) // usage

输出:

代码语言:javascript
复制
[
  {
    "id": "cji6e7qbf000cppatumn9nf6c",
    "children": [
      {
        "id": "cji6e7qbf000dppatymupdw5r",
        "children": [
          {
            "id": "cji6e7qbf000eppatbn3v7qlt",
            "children": []
          }
        ]
      },
      {
        "id": "cji6e7qbf000fppat2ermw8jn",
        "children": []
    }
    ]
  },
  {
    "id": "cji6e7qbf000gppatuxiv0bsh",
    "children": [
    {
      "id": "cji6e7qbf000hppatx3em7n0e",
      "children": []
    }]
  }
]

注意:这将按最初键入的方式回答您的问题。如果children属性有所不同,但都是已知的,则可以按如下方式进行修改:

代码语言:javascript
复制
const replaceIds = obj =>
  evolve({
    id:      cuid,
    cheeto:  map(replaceIds),
    cookies: map(replaceIds),
    donut:   map(replaceIds),
    eggo:    map(replaceIds),
    milk:    map(replaceIds),
    waffle:  map(replaceIds),
  }, obj)

如果它们不同并且未知,那么您需要尝试另一种方法。

票数 0
EN

Stack Overflow用户

发布于 2018-06-09 04:15:22

最简单的方法=递归解决方案。不需要库。

假设您知道每个对象都会有密钥的 id & children,下面的代码将会像发布的那样工作。

否则,如果对象上可能不存在键,则需要将每个突变范围嵌套在" if“大括号中。

代码语言:javascript
复制
const makeId = (objArray) => {
  return objArray.map((obj, i) => {
    obj.id = Math.floor(Math.random() * 1234567890);   // Just making a simple ID.  Typically use "uuid" or some other ID libarary generator.

    if (obj.children.length) obj.children =  makeId(obj.children);

    return obj;
  });
}

makeId(theobject);

备注此解决方案使用ES6。如果您需要使用Babel为ES6设置应用程序/algo的帮助,请查看我写的一篇here文章,该文章将指导您完成这一过程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50767568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档