Отображение некоторых ключей объекта в объекты - PullRequest
2 голосов
/ 08 марта 2020

Я пытаюсь преобразовать этот объект:

url = {
  page: 1,
  limit: 20,
  price_from: 1,
  price_to: 500,
  stock_from: 1,
  stock_to: 200
}

Кому:

consumableURL = {
  page: 1,
  limit: 20,
  price: {
    price_from: 1,
    price_to: 500,
  },
  stock: {
    stock_from: 1,
    stock_to: 200
  }
}

Как это достижимо, многократно используя для учета других возможных введенных ключей в feature?

И я предполагаю также с проверкой, чтобы убедиться, что две пары существуют перед отображением их в объект?

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Я думаю, что следующее может быть возможным решением с .reduce():

const url = {
  page: 1,
  limit: 20,
  price_from: 1,
  price_to: 500,
  stock_from: 1,
  stock_to: 200
};

const keys = ['price', 'stock'];

const entries = Object.entries(url);
const consumableURL = entries.reduce((a, [k, v]) => {
  const contains = keys.some(e => k.indexOf(e) !== -1);

  if (!contains) {
    return {...a, [k]: v};
  } else {
    const prop = k.split('_')[0];
    return { ...a, [prop]: { ...a[prop], [k]: v } };
  }
}, {});

console.log(consumableURL);

Или более коротким способом, который не улучшает читаемость, но работает:

const url = { page: 1, limit: 20, price_from: 1, price_to: 500, stock_from: 1, stock_to: 200 };
const keys = ['price', 'stock'];
const entries = Object.entries(url);
const consumableURL = entries.reduce((a, [k, v]) => !keys.some(e => k.indexOf(e) !== -1) ? {...a, [k]: v} : { ...a, [k.split('_')[0]]: { ...a[k.split('_')[0]], [k]: v } }, {});
console.log(consumableURL);

Надеюсь, это поможет!

1 голос
/ 08 марта 2020

Вы можете разделить и проверить счетчик результатов, чтобы принять решение о вложенных реквизитах.

const url = {
  page: 1,
  limit: 20,
  price_from: 1,
  price_to: 500,
  stock_from: 1,
  stock_to: 200
};

const res = Object.entries(url).reduce((obj, [k, v]) => {
  const splitArr = k.split('_');
  if (splitArr.length > 1) {
    obj[splitArr[0]] = obj[splitArr[0]] || {};
    obj[splitArr[0]][k] = v
  } else
    obj[k] = v;
  return obj;
}, {})

console.log(res)

Если он будет вложенным, вы можете использовать рекурсию или вложенную l oop. Здесь я использую вложенное сокращение, которое будет перебирать массив split для генерации глубоко вложенных значений.

const url = {
  page: 1,
  limit: 20,
  price_from: 1,
  price_to: 500,
  stock_from: 1,
  stock_to: 200,
  stock_abc_to: 200,
  
};

const res = Object.entries(url).reduce((obj, [k, v]) => {
  const splitArr = k.split('_');
  splitArr.slice(0, -1).reduce((o, key) => o[key] = o[key] || {}, obj)[k] = v
  return obj;
}, {})

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