Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.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 获取连接项的数组_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 获取连接项的数组

Javascript 获取连接项的数组,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个类别数组,如: 0: {_id: 1, image: "/static/categories/apartment.png", name: "apartments", properties: Array(2), rootCategoryId: null, …} 1: {_id: 2, image: "/static/categories/car.png", name: "cars", properties: Array(1), rootCategoryId: null, …} 2: {_i

我有一个类别数组,如:

0: {_id: 1, image: "/static/categories/apartment.png", name: "apartments", properties: Array(2), rootCategoryId: null, …}
1: {_id: 2, image: "/static/categories/car.png", name: "cars", properties: Array(1), rootCategoryId: null, …}
2: {_id: 3, image: "/static/categories/dress.png", name: "cloathes", properties: Array(1), rootCategoryId: null, …}
3: {_id: 4, image: "/static/categories/fridge.png", name: "electronicsAndGadgets", properties: Array(1), rootCategoryId: null, …}
4: {_id: 99, image: "/static/categories/phone.png", name: "smartPhones", properties: Array(0), rootCategoryId: 4, …}
5: {_id: 100, image: "/static/categories/shoes.png", name: "shoes", properties: Array(0), rootCategoryId: 3, …}
6: {_id: 1000, image: null, name: "sneakers", properties: Array(0), rootCategoryId: 100, …}
7: {_id: 1001, image: null, name: "sandals", properties: Array(0), rootCategoryId: 100, …}
换句话说

Root category (image: '../png', rootCategoryId: null)

Sub categories (image: '../png' OR null, rootCategoryId: ID)


1 (root) -> 100 (sub1) -> 1000 (sub2)
因为根目录总是有一张图片,有时子类别也没有图片,所以我尝试进行反向搜索,直到找到一张图片。 创建此函数以获取相关类别,但我认为可以做得更好:

    export const getCategoryImageByByCategoryId = id => {
      if (!store) return null;
      const getCategory = (id) => _.find(categoriesList, category => category._id === id);
      const state = store.getState();
      const categoriesList = state.categories.categoriestList;
      let currentCategory = getCategory(id);
      const result = [currentCategory];
      while (currentCategory !== null) {
        const nextId = currentCategory.rootCategoryId;
        if (!nextId) {
          currentCategory = null;
        } else {
          currentCategory = getCategory(nextId);
          result.push(currentCategory);
        }
      }
      return result;
    };

最好的方法是什么?是否应使用reduce fn?

注意以下调用:

const getCategory = (id) => _.find(categoriesList, category => category._id === id);
表示可能必须迭代整个数组的迭代(最坏情况)。这具有O(n)时间复杂性

相反,请准备一张地图,以便您可以通过其id在固定时间内识别类别:

let map = new Map(state.categories.categoriesList.map(category => [category._id, category]));
只要此列表不变,您也不必重复创建此地图。一旦拥有了它,您就可以按如下所示的id检索类别:

category = map.get(id);

其次,从您的问题来看,不清楚您是否真的需要一个数组作为返回值,以及一个包含根的整个路径的数组。如果您真正关心的是获取图像,那么您不应该需要该数组,并且应该在找到
category.image
的非
null
值后立即退出循环,并返回该值。

您可以创建一个以
\u id
为键的对象,并调用该函数,直到获得图像为止

函数getCategoryImageByCategoryId(id){ 返回引用[id]。图像 ||GetCategoryImageByCategoryId(引用[id].rootCategoryId); } var data=[{u-id:1,图像:“/static/categories/partment.png”,名称:“公寓”,属性:[],rootCategoryId:null},{{u-id:2,图像:“/static/categories/car.png”,名称:“cars”,属性:[],rootCategoryId:null},{u-id:3,图像:“/static/categories/dress.png”,名称:“cloathes”,属性:[],rootCategoryId:null},{u-id:4,image:“/static/categories/fredge.png”,name:“electronicsAndGadgets”,properties:[],rootCategoryId:null},{u-id:99,image:“/static/categories/phone.png”,name:“智能手机”,properties:[],rootCategoryId:3},{u-id:1000,image:null,name:“运动鞋”,属性:[],rootCategoryId:100},{u id:1001,图像:null,名称:“sandals”,属性:[],rootCategoryId:100}, 参考=数据。减少((r,o)=>{ r[o._id]=o; 返回r; }, {});
console.log(getCategoryImageByCategoryId(1000))没错,我不需要返回数组,相反,它应该返回一个带有图像url的字符串,只是我想到的第一件事是获取所有相关的类别,然后用图像再次搜索第一个类别我永远不会有一个巨大的类别数组,我相信最大值为100,这不应该是个问题,但非常感谢。使用Map在一个巨大的列表中获取值的概念是一个救命稻草。如果你只需要处理100个条目,那么就真的没有什么收获了。然后,我必须问,是什么让你来问这个问题?不可能是你遇到了性能问题……实现问题,想知道什么是最简洁的方法来解决这个问题为了解决这个问题,在编写代码方面,如果它是关于“整洁”的,那么这将是一个更适合的问题。但是,如果您有实现问题,那么请将您的问题集中在这些问题上。这假设数组已排序