Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 JS:按特定顺序获取对象的ID_Javascript_Arrays_Object_Ecmascript 6 - Fatal编程技术网

Javascript JS:按特定顺序获取对象的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

更新:在本例中,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: '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