Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何替换javascript对象中的每个ID实例_Javascript - Fatal编程技术网

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

如何替换javascript对象中的每个ID实例,javascript,Javascript,我试图用一个随机唯一的id值替换“id”的每个实例 有没有一种方法可以一次更换所有这些部件 我的代码: var theobject = [ { "id":"lol", "milk":[ { "id":"lol", "waffle":[ { "id":"lol",

我试图用一个随机唯一的id值替换“id”的每个实例

有没有一种方法可以一次更换所有这些部件

我的代码:

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

使用
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": []
    }]
  }
]
注意:这将回答您最初键入的问题。如果
子项
道具不同,但都是已知的,您可以这样修改:

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)

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

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

假设您知道每个对象都有
id
&
子对象
的事实,下面的内容将按发布的方式工作

否则,如果对象上可能不存在密钥,则需要将每个变异范围嵌套在“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设置应用程序/算法,请查看我撰写的一篇文章,这篇文章将引导您完成此过程。

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

var theobject=[{“id”:“lol”,“milk”:[{“id”:“lol”,“waffle”:[{“id”:“lol”,“eggo”:[]}},{“id”:“lol”,“cookies”:[]},{“id”:“lol”,“donut”:[{“id”:“lol”,“cheeto”:[]}];
函数更新ID(arr){
对于(变量i=0;i{
if(arr[i][key].constructor.toString().indexOf(“数组”)>-1)
更新ID(arr[i][key]);
});
if(arr[i].id)
arr[i].id=Math.random().toString(36.slice(-8);
}
}
更新ID(对象);

console.log(对象)