Как преобразовать массив строк в объект? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть объект массива. Для получения принятого вывода я сделал два метода в коде.

Метод 1: собирается показать массив объектов вместо массива строковых значений внутри объекта.
Метод 2: собирается показать мой подтвержденный вывод .

let data = {
  Invoice: ["can_view", "can_create", "can_edit", "can_delete"],
  license: ["can_view", "can_create", "can_edit", "can_delete"] 
}

проблема в том, что я сделал дополнительный l oop внутри метода 1 для получения массива объектов. затем он преобразован в метод для приема данных

Мне не нужен метод 1, я хочу получить мой принятый массив строк на основе данных.

что следует изменить внутри метода 2?

// Метод 1:

 let values = Object.entries(data).map(([key, values]) => ({
      [key]: values.map(v => ({ label: v, value: v }))
    }));
console.log(values)

// Метод: 2

 function convertdatatoObj (value,group){
   let permissionAccess;
    let permissionArray = value && value.filter(item => item[group]);
    const permissionObj = Object.assign({}, permissionArray);
    let res =
      permissionObj[0] &&
      permissionObj[0][group] &&
      permissionObj[0][group].map(item => {
        return {
          value: item.value
        };
      });
    const obj = Object.assign({}, res);
    permissionAccess = Object.fromEntries(
      Object.entries(obj) && Object.entries(obj).map(([k, v]) => [v.value, v])
    );
    return permissionAccess;

 }

 let result = convertdatatoObj(values,"Invoice")

console.log(result) 

// My accepeted Output would be this format:

let res = {
can_view: {value: "can_view"},
can_create: {value: "can_create"},
can_edit: {value: "can_edit"},
can_delete: {value: "can_delete"},
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

У вас есть объект и имя, вы можете просто получить соответствующий массив и преобразовать его, используя Array#map в ключ, который является заданной записью массива, и значением, равным {value: <item entry>} , Наконец, создайте объект, используя Object.fromEntries:

let data = {
  Invoice: ["can_view", "can_create", "can_edit", "can_delete"],
  license: ["can_view", "can_create", "can_edit", "can_delete"]
}

function convertdatatoObj(value, group) {
  if (!value && !Array.isArray(value[group]))
    return;

  return Object.fromEntries(
    value[group].map(permission => [permission, { value: permission }])
  )
}

let result = convertdatatoObj(data, "Invoice")

console.log(result)

Это можно сделать с помощью Array#reduce путем клонирования объекта каждый раз:

let data = {
  Invoice: ["can_view", "can_create", "can_edit", "can_delete"],
  license: ["can_view", "can_create", "can_edit", "can_delete"]
}

function convertdatatoObj(value, group) {
  if (!value && !Array.isArray(value[group]))
    return;

  return value[group]
    .reduce(
      (obj, permission) => ( {...obj, [permission]: { value: permission } } ), 
      {}
    )
}

let result = convertdatatoObj(data, "Invoice")

console.log(result)

Или мутировать один экземпляр с Object.assign:

let data = {
  Invoice: ["can_view", "can_create", "can_edit", "can_delete"],
  license: ["can_view", "can_create", "can_edit", "can_delete"]
}

function convertdatatoObj(value, group) {
  if (!value && !Array.isArray(value[group]))
    return;

  return value[group]
    .reduce(
      (obj, permission) => Object.assign(obj, { [permission]: { value: permission } } ), 
      {}
    )
}

let result = convertdatatoObj(data, "Invoice")

console.log(result)
1 голос
/ 03 апреля 2020

Вы можете взять Object.fromEntries с сопоставленным массивом записей.

var permissions = ["can_view", "can_create", "can_edit", "can_delete"],
    result = Object.fromEntries(permissions.map(value => [value, { value }]));

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