Javascript JS:按特定顺序获取对象的ID
我需要以正确的层次顺序获取一组对象的所有ID 更新:在本例中,ID是按字母顺序排列的,但它们应该表示随机字符串Javascript JS:按特定顺序获取对象的ID,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,我需要以正确的层次顺序获取一组对象的所有ID 更新:在本例中,ID是按字母顺序排列的,但它们应该表示随机字符串 [ { _id: 'abc', parent: 'mainID', main: 'mainID', order: 1, type: 'item' }, { _id: 'def', parent: 'mainID', main: 'mainID', order: 2, type: 'item' }, { _id: 'ghi', parent: 'mainID', main:
[
{ _id: 'abc', parent: 'mainID', main: 'mainID', order: 1, type: 'item' },
{ _id: 'def', parent: 'mainID', main: 'mainID', order: 2, type: 'item' },
{ _id: 'ghi', parent: 'mainID', main: 'mainID', order: 3, type: 'group' },
{ _id: 'jkl', parent: 'ghi', main: 'mainID', order: 1, type: 'item' },
{ _id: 'mno', parent: 'ghi', main: 'mainID', order: 2, type: 'group' },
{ _id: 'pqr', parent: 'mno', main: 'mainID', order: 1, type: 'item' },
{ _id: 'stu', parent: 'mainID', main: 'mainID', order: 4, type: 'item' }
]
让我简单解释一下我的数据结构:
有几个项目(类型
)。在第一级中,所有项目/组都有父级mainID
因此,对于第一级元素,ID是:['abc','def','ghi','stu']
。
第三个元素(ghi
)是一个组元素,它还有两个子元素,它们的父元素是ghi
第二个子元素(“mno”)也是一个组,它有一个子元素
初始数组中的对象可以具有无序顺序,这就给我带来了问题。
每个级别中元素的顺序由顺序值(升序)确定
因此,初始数组也可以如下所示:
[
{ _id: 'ghi', parent: 'mainID', main: 'mainID', order: 3, type: 'group' },
{ _id: 'jkl', parent: 'ghi', main: 'mainID', order: 1, type: 'item' },
{ _id: 'mno', parent: 'ghi', main: 'mainID', order: 2, type: 'group' },
{ _id: 'pqr', parent: 'mno', main: 'mainID', order: 1, type: 'item' },
{ _id: 'stu', parent: 'mainID', main: 'mainID', order: 4, type: 'item' },
{ _id: 'abc', parent: 'mainID', main: 'mainID', order: 1, type: 'item' },
{ _id: 'def', parent: 'mainID', main: 'mainID', order: 2, type: 'item' }
]
对象以更好的视觉方式表示此结构:
abc
def
ghi
jkl
mno
pqr
stu
(elements) => {
const result = []
elements
.filter(item => (item.parent === item.main))
.forEach(elm => {
result.push(elm._id)
if (elm.type === 'group') {
getOrderedId(elements, elm._id)
}
})
return result
}
我需要的是按从上到下的顺序排列的ID
因此,结果应该是:
['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu']
由于嵌套结构,我的尝试无效:
abc
def
ghi
jkl
mno
pqr
stu
(elements) => {
const result = []
elements
.filter(item => (item.parent === item.main))
.forEach(elm => {
result.push(elm._id)
if (elm.type === 'group') {
getOrderedId(elements, elm._id)
}
})
return result
}
我将首先创建一个映射,由
\u id
值键入,其中每个条目都以一个空数组开始,需要用父项的子项(如果它有子项)填充该数组。添加一个额外的键来表示main
条目,即根
然后迭代输入,将每个对象注入到上述树结构的适当数组中
然后在树结构中执行顺序遍历(使用递归),并在访问对象时生成对象
以下代码假定:
- 所有对象都属于同一棵树(具有相同的
属性)李>main
值不留间隙,以1开头顺序
类型
属性--它是冗余信息
有序函数(元素){
如果(!elements.length)返回[];
const rootId=elements[0];
const children=newmap(elements.Map(e=>[e.[u id,[])).set(rootId,[]);
elements.forEach(e=>children.get(e.parent)[e.order-1]=e);
返回[…(函数*访问(id){
如果(!children.has(id))返回;
for(让孩子成为孩子的孩子。获取(id)){
产子;
收益*访问(儿童身份证);
}
})(rootId)];
}
const elements=[{u-id:'ghi',parent:'mainID',mainID',order:3,type:'group'},{u-id:'jkl',parent:'ghi',main:'mainID',order:1,type:'item'},{id:'ghi',mainID',order:2,type:'group'},{id:'pqr',parent:'mno',main:'mainID',order:1,type:'item'},{u-id:'stu',父项:'mainID',主项:'mainID',顺序:4,类型:'item'},{u-id:'abc',父项:'mainID',主项:'mainID',顺序:1,类型:'item'},{u-id:'def',父项:'mainID',主项:'mainID',顺序:2,类型:'item'};
console.log(ordered(elements));
您可以先按顺序
排序,然后再按字母顺序id排序吗?如果可以,您可以编写一个自定义排序方法,使用顺序
,如果它们相似,则使用id
@lemieuxster,id是随机字符串(用此信息更新了我的帖子-很抱歉错过了)正确的标准是什么,parent=mainID,order asc,如果任何元素都有child…然后用相同的parent,order asc打印所有的子child…之后,mainID的其余部分,order…。结果是,\u id单独排列。你问这个问题和显示数据的方式非常混乱。从视觉上看,我理解你的意思,但是那么你的数组(重新)表示不正确。你能用实际(段)更新代码吗嵌套结构的排序?如果它们都在同一级别,它应该不能对它们进行排序-它们是否是随机字符串并不重要。@Sk.对于每一级别,顺序值和如果有组元素,我们必须进入下一级别,该级别也是按顺序值排序的。事实上,这是我假设的。或者你看到了违反顺序的内容吗那条规则?我如何重写forEach(e=>children.get(e.parent)[e.order-1]=e)
?因为它与arrow函数的standardJS不匹配,所以不应该返回赋值
你可以把它变成一个语句块:forEach(e=>{children.get(e.parent)[e.order-1]=e})
最后一个问题:如果订单值以0
而不是1
开头,会有区别吗?是的,会有区别。在这种情况下,只需e.order
即可更改e.order-1
。