为了账号安全,请及时绑定邮箱和手机立即绑定

获取连接项的数组

获取连接项的数组

慕雪6442864 2021-11-18 20:19:27
我有一个类别数组,如: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)因为 root 总是有图片,有时子类别没有图片,所以我试图进行反向搜索,直到找到图片。创建此函数以获取相关类别,但我认为可以做得更好:    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吗?
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您可以使用_idas 键创建一个对象并调用该函数,直到获得图像。


function getCategoryImageByByCategoryId(id) {

    return reference[id].image

        || getCategoryImageByByCategoryId(reference[id].rootCategoryId);

}


var data = [{ _id: 1, image: "/static/categories/apartment.png", name: "apartments", properties: [], rootCategoryId: null }, { _id: 2, image: "/static/categories/car.png", name: "cars", properties: [], rootCategoryId: null }, { _id: 3, image: "/static/categories/dress.png", name: "cloathes", properties: [], rootCategoryId: null }, { _id: 4, image: "/static/categories/fridge.png", name: "electronicsAndGadgets", properties: [], rootCategoryId: null }, { _id: 99, image: "/static/categories/phone.png", name: "smartPhones", properties: [], rootCategoryId: 4 }, { _id: 100, image: null, name: "shoes", properties: [], rootCategoryId: 3 }, { _id: 1000, image: null, name: "sneakers", properties: [], rootCategoryId: 100 }, { _id: 1001, image: null, name: "sandals", properties: [], rootCategoryId: 100 }],

    reference = data.reduce((r, o) => {

        r[o._id] = o;

        return r;

    }, {});


console.log(getCategoryImageByByCategoryId(1000));


查看完整回答
反对 回复 2021-11-18
?
MYYA

TA贡献1868条经验 获得超4个赞

请注意以下调用:

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);

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


查看完整回答
反对 回复 2021-11-18
  • 2 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信