JSFiddle - React, Tailwind, and code Playground

JavaScript

console.clear()
var data = {
  "search[id]": 1,
  "search[ids]": "",
  "search[entity_name]": "",
  "search[field_name]": "",
  "search[field_format][a]": "asdf",
  "search[field_format][b]": "bzzt",
  "page": 5,
  "per_page": 7
}
var key, keys, currElem, result = {}
for(key in data) {
  if (keys = key.match(/\[[^\]]*\]/g)) { // получаем все ключи
    var prefix = key.substr(0, key.indexOf('[')) // коренвой ключ
    if(!(prefix in result)) { // если нет такого элемента
      result[prefix] = {} // создаем его
    }
    currElem = result[prefix] // и запоминаем ссылку на него
    keys.forEach((elem, index)=>{ // перебираем остальные ключи
      elem = elem.slice(1, -1) // обрезаем скобки
      if(!(elem in currElem)) { // если нет такого элемента
        // создаем пустой объект. если последний в цепочке - присваеваем значение
        currElem[elem] = index == keys.length - 1 ? data[key] : {}
      }
      currElem = currElem[elem]
    })
    console.log(prefix, keys)
  } else {
    result[key] = data[key]
  }
}
console.log(result)