От Json до Javascript массив объектов - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь создать объект javascript в качестве входных данных для bootstrap treeview. У меня есть php, который захватывает данные из mysql, а json кодирует результаты в следующую структуру:

{"Company 1":{"Production":["Brands","Categories","Products","Stocks"],"Sales":["Customers","Orders","Staffs","Stores"]},"Company 2":{"Production":["Brands","Categories","Products","Stocks"],"Sales":["Customers","Orders","Staffs","Stores"]}}

PHP код для создания этого json:

$databases=[];
foreach($result as $row){
$database=$row["database"];
$schema=$row["schema"];
$table=$row["object"];
if(!array_key_exists($database, $databases))
    $databases[$database]=[];
if(!array_key_exists($schema, $databases[$database]))
    $databases[$database][$schema]=[];
array_push($databases[$database][$schema], $table);
}

echo json_encode($databases);

Но я изо всех сил пытаюсь поместить эту структуру json во вложенный массив требуемых JavaScript объектов. Ниже приведена желаемая структура:

[ { text: "Company 1", nodes: [ { text: "Production", nodes: [ { text: "Brands" }, { text: "Categories" }, { text: "Products" }, { text: "Stocks" } ] }, { text: "Sales", nodes: [ { text: "Customers" }, { text: "Orders" }, { text: "Staffs" }, { text: "Stores" } ] } ] }, { text: "Company 2", nodes: [ { text: "Production", nodes: [ { text: "Brands" }, { text: "Categories" }, { text: "Products" }, { text: "Stocks" } ] }, { text: "Sales", nodes: [ { text: "Customers" }, { text: "Orders" }, { text: "Staffs" }, { text: "Stores" } ] } ] } ];

Любые предложения приветствуются

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Я предлагаю для этого рекурсивную функцию flatItem. Я также представляю вспомогательную функцию array_map_with_keys, потому что собственная функция array_map PHP игнорирует клавиши, и в вашем случае она нам нужна.


function array_map_with_keys($callback, $array){
  return array_map($callback, array_keys($array), $array);
}

function flatItem($key, $value) {
  if(is_array($value)){
    return 
      ["text" => $key,
       "nodes" => array_map_with_keys("flatItem", $value)
      ];  
  }else{
    return ["text" => $value];
  }
}

$converted = array_map_with_keys("flatItem", $databases);

echo json_encode($converted);

Результат такой, как вы ожидаете:

[{"text":"Company 1","nodes":[{"text":"Production","nodes":[{"te
xt":"Brands"},{"text":"Categories"},{"text":"Products"},{"text":
"Stocks"}]},{"text":"Sales","nodes":[{"text":"Customers"},{"text
":"Orders"},{"text":"Staffs"},{"text":"Stores"}]}]},{"text":"Com
pany 2","nodes":[{"text":"Production","nodes":[{"text":"Brands"}
,{"text":"Categories"},{"text":"Products"},{"text":"Stocks"}]},{
"text":"Sales","nodes":[{"text":"Customers"},{"text":"Orders"},{
"text":"Staffs"},{"text":"Stores"}]}]}]

вы можете передать его на js.

1 голос
/ 11 июля 2020

const data = {
  "Company 1": {
    "Production": ["Brands", "Categories", "Products", "Stocks"],
    "Sales": ["Customers", "Orders", "Staffs", "Stores"]
  },
  "Company 2": {
    "Production": ["Brands", "Categories", "Products", "Stocks"],
    "Sales": ["Customers", "Orders", "Staffs", "Stores"]
  }
}

function converter(data) {
  return Object.entries(data).reduce((converted, [key, val]) => {
    const element = {
      text: key,
      nodes: [...Object.entries(val).map(([key2, val2]) => {
        return {
          text: key2,
          nodes: [...Object.values(val2).map(val3 => {
            return {
              text: val3
            }
          })]
        }
      })]
    }
    converted.push(element);
    return converted
  }, []);
}

console.log(converter(data))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...