在javascript中使用递归函数

问题描述 投票:0回答:1

我想要这样的对象:

let params_ = {
  filters: {
    orderId: null,
    status: ['rejected', 'accepted'],
    orderStatus: 'A',
    a: {
      c: 'deepFilter'
    }
  },
  page: {
    limit: 15,
    offset: 0
  }
}

并将其转换为:

{
  filters[orderId]: null,
  filters[status]: ['rejected', 'acepted'],
  filters[orderStatus]: 'A',
  filters[a.c]: 'deepFilter',
  page[limit]: 15,
  page[offset]: 0,
}

我能够进入两个级别并按需要获取结果,但是我在知道应该在何处进行递归调用以能够调用深度嵌套级别时遇到了问题。

到目前为止,我已经尝试了以下方法:

let params_ = {
  filters: {
    orderId: null,
    status: ['rejected', 'accepted'],
    orderStatus: 'A',
    a: {
      c: 'a'
    }
  },
  page: {
    limit: 15,
    offset: 0
  }
}

function paramsSerializer(parameters) {
  let finalParameters = {};

  for (let key in parameters) {
    if (parameters.hasOwnProperty(key)) {
      if (typeof parameters[key] === 'object' && parameters[key] !== null) {
        finalParameters = {
          ...finalParameters,
          ...constructParameterFromObject(parameters[key], key)
        }
      }
    }
  }

  console.log(finalParameters);
}

function constructParameterFromObject(object, prepend = null) {
  let finalParameters = {};

  for (let key in object) {
    if (object.hasOwnProperty(key)) {
      finalParameters = {
        ...finalParameters,
        ...{
          [`${prepend}[${key}]`]: object[key]
        }
      }
    }
  }

  return finalParameters;
}

paramsSerializer(params_);

您可以在此处获得实时示例:https://codesandbox.io/s/angry-dream-sl0gr任何光将不胜感激。非常感谢您的提前帮助

javascript
1个回答
0
投票

您可以执行以下操作:

let params_ = {
  filters: {
    orderId: null,
    status: ['rejected', 'accepted'],
    orderStatus: 'A',
    a: {
      c: 'deepFilter'
    }
  },
  page: {
    limit: 15,
    offset: 0
  }
}

function paramsSerializer(params, prefix) {
 return Object.entries(params).reduce((a, [key, value]) => {
   let fullKey = '';
   if (prefix) {
     if (prefix.includes('[')) {
       fullKey = prefix.replace(']', `.${key}]`);
     } else {
       fullKey = `${prefix}[${key}]`;
     }
   } else {
     fullKey = key;
   }
   if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
     a = {...a, ...paramsSerializer(value, fullKey)};
   } else {
     a = {...a, [fullKey]: value};
   }
   return a;
 }, {});
}

const ret = paramsSerializer(params_);
console.log(ret);

仅在原始对象的键不包含[]字符的情况下才有效。

© www.soinside.com 2019 - 2024. All rights reserved.