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

时间:2018-06-08 19:51:22

标签: javascript

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

有没有办法一次性更换所有这些?

我的代码:

var theobject = [
    {
    "id":"lol",
    "milk":[
            {
                "id":"lol",
                "waffle":[
                        {
                            "id":"lol",
                            "eggo":[]
                        }
                    ]
            },
            {
                "id":"lol",
                "cookies":[]
            }
        ]
    },
    {
    "id":"lol",
    "donut":[
            {
                "id":"lol",
                "cheeto":[]
            }
        ]
    }
];

3 个答案:

答案 0 :(得分:1)

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

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 :(得分:0)

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

const cuid = require('cuid')
const { evolve, map } = require('ramda')

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

map(replaceIds, theobject) // usage

输出:

[
  {
    "id": "cji6e7qbf000cppatumn9nf6c",
    "children": [
      {
        "id": "cji6e7qbf000dppatymupdw5r",
        "children": [
          {
            "id": "cji6e7qbf000eppatbn3v7qlt",
            "children": []
          }
        ]
      },
      {
        "id": "cji6e7qbf000fppat2ermw8jn",
        "children": []
    }
    ]
  },
  {
    "id": "cji6e7qbf000gppatuxiv0bsh",
    "children": [
    {
      "id": "cji6e7qbf000hppatx3em7n0e",
      "children": []
    }]
  }
]

注意:这可以回答您最初输入的问题。如果children道具有所不同,但都是已知的,您可以这样修改:

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)

如果它们有所不同且未知,那么您需要尝试其他方法。

答案 2 :(得分:0)

最简单的方法= 递归解决方案。没有必要的图书馆。

假设您知道每个对象都有 id&amp; children以下内容将按照发布的方式生效。

否则,如果对象上可能不存在密钥,则需要将每个变异范围嵌套在“if”括号内。

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设置应用程序/算法时需要帮助,请查看我撰写的here文章,该文章将指导您完成此任务。