如何替换javascript对象中的每个ID实例
我试图用一个随机唯一的id值替换“id”的每个实例 有没有一种方法可以一次更换所有这些部件 我的代码:如何替换javascript对象中的每个ID实例,javascript,Javascript,我试图用一个随机唯一的id值替换“id”的每个实例 有没有一种方法可以一次更换所有这些部件 我的代码: var theobject = [ { "id":"lol", "milk":[ { "id":"lol", "waffle":[ { "id":"lol",
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(对象)你试过什么了吗?