bugfix> javascript > 投稿

単純な配列から深くネストされたJSオブジェクトを作成しようとしています。トリッキーな部分は、配列内の次のアイテムを常に前のアイテムに追加する必要があることです。

私の配列が次のようになっていると仮定します。

const filters = [
    [
        {brand: {eq: 'BMW'}},
        {brand: {eq: 'AUDI'}}
    ],
    [
        {year: {eq: '2019'}},
        {year: {eq: '2020'}}
    ],
    [
        {country: {eq: 'CH'}},
        {country: {eq: 'DE'}}
    ]
]

その構造のオブジェクトを取得するにはどうすればよいですか?

   query: {
      and: {
        or: [
          { brand: { eq: 'BMW' } },
          { brand: { eq: 'AUDI' } }
        ],
        and: {
          or: [
            { year: { eq: '2019' } },
            { year: { eq: '2020' } }
          ],
          and: {
            or: [
              { country: { eq: 'CH' } },
              { country: { eq: 'DE' } }
            ],
            ... and so on
          }
        }
      }
    },

前の「or」ブロックに新しい「or」ブロックを追加するにはどうすればよいですか?

回答 2 件
  • 配列を調べながら、ネストされた構造を構築できます。アイテムごとに、ネストされたオブジェクトを追加します。 or アイテムにリンクするキーと、後続の各反復は前のアイテムで機能します

    const filters = [
        [
            {brand: {eq: 'BMW'}},
            {brand: {eq: 'AUDI'}}
        ],
        [
            {year: {eq: '2019'}},
            {year: {eq: '2020'}}
        ],
        [
            {country: {eq: 'CH'}},
            {country: {eq: 'DE'}}
        ]
    ]
    const query = {};
    let current = query;
    for (const filter of filters) {
      current.and = { or: filter };
      current = current.and; 
    }
    console.log(query);
    
    

  • のためだけに reduce チャレンジ:

    const filters = [
        [
            {brand: {eq: 'BMW'}},
            {brand: {eq: 'AUDI'}}
        ],
        [
            {year: {eq: '2019'}},
            {year: {eq: '2020'}}
        ],
        [
            {country: {eq: 'CH'}},
            {country: {eq: 'DE'}}
        ]
    ];
    const query = {};
    filters.reduce((x, or) => x.and = { or }, query);
    console.log(query);
    
    

    しかし、地獄のようにハッキー:

    reduce 副作用あり

    割り当てを返します

    VLAZのアプローチは進むべき道です。

あなたの答え