Поиск в Json для фильтров - PullRequest
0 голосов
/ 24 января 2020

У меня есть JSON объект, подобный этому

 xyz = {
  "101": {
    "categoryName": "ectronics",
    "categorslug": "electronics",
    "catId": "101",
    "name": [
      {
        "childCategoryName": "Cameras",
        "childCategorySlug": "cameras",
        "childCategoryId": "102",
        "childCategoryParentId": "109"
      },
      {
        "childCategoryName": "Accessories",
        "childCategorySlug": "cameras-and-accessories",
        "childCategoryId": "102",
        "childCategoryParentId": "111"
      },
      {
        "childCategoryName": "ras & Accessories",
        "childCategorySlug": "cameras-and-accessories",
        "childCategoryId": "102",
        "childCategoryParentId": "112"
      }
    ]
  },
  "109": {
    "categoryName": "shion",
    "categorslug": "fashion",
    "catId": "109",
    "name": [
      {
        "childCategoryName": "Fashion Accessories",
        "childCategorySlug": "fashion-accessories",
        "childCategoryId": "110",
        "childCategoryParentId": "109"
      }
    ]
  },
  "118": {
    "categoryName": "Baby & Kids",
    "categorslug": "baby-and-kids",
    "catId": "118",
    "name": [
      {
        "childCategoryName": "Baby Footwear",
        "childCategorySlug": "baby-footwear",
        "childCategoryId": "119",
        "childCategoryParentId": "118"
      }
    ]
  }
}

Теперь у меня есть фильтр категорий, основанный на поисковых запросах. Я должен уменьшить объект, я делал это, но проблема в том, что я не могу уменьшить его от совпадающего объекта.

Решение, которое я пробовал, состоит в следующем:

topIds = (event) => {
    let rs = [];
    let inn = '';
    let cat = xyz;
    for (let i in cat){
        for( let j in cat[i].name ){
            inn = cat[i].name[j].childCategoryName
            if ( inn.toLowerCase().search(event.target.value.toLowerCase()) !== -1 ){
                rs.push(cat[i].name[j].childCategoryParentId)
            }
        }
    }
    console.log('Filtered Ids', rs);
    this.elm(cat, rs)
  }

  elm = (cat, rs) => {
    let filtered =  rs.map(function (k){
        return cat[k]
    })
    console.log('Filtered va;ues', filtered);
    return filtered;
  }

Работает нормально, но вместо того, чтобы соответствовать возвращаемому полному объекту, указывает на то, что я ошибаюсь здесь.

Итак, технически, если пользователь говорит, что искать "Камеры"

Он должен вернуться, как это,

{
      "101": {
        "categoryName": "ectronics",
        "categorslug": "electronics",
        "catId": "101",
        "name": [
          {
            "childCategoryName": "Cameras",
            "childCategorySlug": "cameras",
            "childCategoryId": "102",
            "childCategoryParentId": "109"
          }
       ]
      }
}

Благодарю вас, ребята, заранее.

1 Ответ

1 голос
/ 24 января 2020

из того, что я понимаю .. внимание, вы должны сделать копию найденного объекта, то же самое для соответствующего ребенка

const xyz = 
  { 101: 
    { categoryName: 'ectronics'
    , categorslug : 'electronics'
    , catId       : '101'
    , name: 
      [ { childCategoryName    : 'Cameras'
        , childCategorySlug    : 'cameras'
        , childCategoryId      : '102'
        , childCategoryParentId: '109'
        } 
      , { childCategoryName    : 'Accessories'
        , childCategorySlug    : 'cameras-and-accessories'
        , childCategoryId      : '102'
        , childCategoryParentId: '111'
        } 
      , { childCategoryName    : 'ras & Accessories'
        , childCategorySlug    : 'cameras-and-accessories'
        , childCategoryId      : '102'
        , childCategoryParentId: '112'
    } ] } 
  , 109: 
    { categoryName: 'shion'
    , categorslug : 'fashion'
    , catId       : '109'
    , name: 
      [ { childCategoryName    : 'Fashion Accessories'
        , childCategorySlug    : 'fashion-accessories'
        , childCategoryId      : '110'
        , childCategoryParentId: '109'
    } ] } 
  , 118: 
    { categoryName: 'Baby & Kids'
    , categorslug : 'baby-and-kids'
    , catId       : '118'
    , name: 
      [ { childCategoryName    : 'Baby Footwear'
        , childCategorySlug    : 'baby-footwear'
        , childCategoryId      : '119'
        , childCategoryParentId: '118'
  } ] } } 

function getPath2childCategoryName(obj,val)
  {
  let child = null
    , resp  = {}
    ;
  for(let key in obj)
    {
    child = obj[key].name.find(n=>n.childCategoryName===val)
    if (child)
      {
      resp[key]      = {...obj[key]} 
      resp[key].name = [ {...child} ]
      break
      }
    }
  return resp
  }

let bob = getPath2childCategoryName(xyz,'Cameras')

console.log( JSON.stringify(bob,0,2) )
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...