Задать вопрос
@lexstile

Как из свойств исходного объекта сделать массив объектов со значениями полей первого?

Есть объект:
const obj = {
  field1: 1000,
  field2: 2000,
  field3: {
    field4: 'test4',
    field5: 'test5',
  },
};

Необходимо получить:
// [{ value: 1000 }, { value: 2000 }, { value: 'test4' }, { value: 'test5' }]

Пробовал так (не довел):
const getValues = (params) => {
  const array = [];

// keys, потому что нужно делать доп. проверку на ключ
  Object.keys(params).reduce((acc, value) => {
    if (typeof params[value] === 'object') {
      getValues(params[value]);
    }

    return array.push({ value: params[value] });
  }, []);

  return array;
};

Нужна рекурсия, т. к. мы не знаем вложенность объекта.
  • Вопрос задан
  • 168 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Рекурсия есть:

const getPrimitives = data =>
  data instanceof Object
    ? Object.values(data).flatMap(getPrimitives)
    : [ data ];

const result = getPrimitives(obj).map(value => ({ value }));

или

function* getPrimitives(data) {
  if (data instanceof Object) {
    for (const k in data) if (Object.hasOwn(data, k)) {
      yield* getPrimitives(data[k]);
    }
  } else {
    yield data;
  }
}

const result = Array.from(getPrimitives(obj), n => ({ value: n }));

Рекурсии нет:

function getNestedData(data, test, getter = n => n) {
  const result = [];

  for (const stack = [ data ]; stack.length;) {
    const n = stack.pop();

    if (n instanceof Object) {
      stack.push(...Object.values(n).reverse());
    }

    if (test(n)) {
      result.push(getter(n));
    }
  }

  return result;
}

const resutl = getNestedData(obj, n => n !== Object(n), n => ({ value: n }));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы