Преобразование данных JavaScript / lodash - PullRequest
1 голос
/ 22 марта 2019

var original = {
  "8": [{
      "temp": {
        "a": 1
      },
      "algo_id": 1
    },
    {
      "temp": {
        "a": 2
      },
      "algo_id": 101
    }
  ],
  "13": {
    "temp": {
      "temp1": [1, 2]
    },
    "algo_id": 2
  }
};

const values = _.values(original);
const temp = _.map(values, (v) => {
  if (_.isArray(v)) {
    return _.mapValues(_.keyBy(v, 'algo_id'), a => _.pick(a, 'temp'));
  }
});

console.log(temp);
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Ожидаемое:

карта, в которой значения algo_id указаны в качестве ключей, а температура - в качестве значений.как показано ниже и т. д.

      {
    "1": {
        "temp": {
            "a": 1
        }
    },
    "101": {
        "temp": {
            "a": 2
        }
    },
    "2": {
        "temp": {
            "temp1": [1, 2]
        }
    }
}

Как добавить ключ и значения, которые не являются массивом в объекте .?

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Нет необходимости использовать lodash, вы можете сделать это простым JavaScript для этого.

let original = {
  "8": [{
      "temp": {
        "a": 1
      },
      "algo_id": 1
    },
    {
      "temp": {
        "a": 2
      },
      "algo_id": 101
    }
  ],
  "13": {
    "temp": {
      "temp1": [1, 2]
    },
    "algo_id": 2
  }
};

console.log(convert(original, 'algo_id'));

function convert(data, key) {
  let process = function(value, key, result) {
    result[value[key]] = value;
    delete result[value[key]][key]; // Remove the `algo_id` key
  };
  return Object.keys(data).reduce((result, k, i) => {
    if (Array.isArray(data[k])) {
      data[k].forEach(val => process(val, key, result));
    } else {
      process(data[k], key, result);
    }
    return result;
  }, {});
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
<!--

{
    "1": {
        "temp": {
            "a": 1
        }
    }
}

-->
1 голос
/ 22 марта 2019

Один из способов сделать это (без использования lodash) заключается в следующем:

const transform = (original) => Object.values(original)
  .flat()
  .reduce((all, {algo_id, ...rest}) => ({...all, [algo_id]: rest}), {})

const original ={"13": {"algo_id": 2, "temp": {"temp1": [1, 2]}}, "8": [{"algo_id": 1, "temp": {"a": 1}}, {"algo_id": 101, "temp": {"a": 2}}]}

console.log(transform(original))

Но это делает предположение, что вы можете использовать брата algo_id как есть.Ваш пример, кажется, показывает дальнейшую обработку этого, для которого я не вижу никакого правила.

Если ваши целевые среды не поддерживают flat, вы можете заменить это:

      .flat()

с этим:

      .reduce((a, b) => a.concat(b), [])
0 голосов
/ 22 марта 2019

Используя lodash, после получения значений выровняйте смешанный массив массивов и объектов, используйте keyBy для преобразования обратно в объект с ключом algo_id, а затем сопоставьте субобъект, чтобы пропустить свойство algo_id.

const { flow, partialRight: pr, values, flatten, keyBy, mapValues, omit } = _

const fn = flow(
  values, // convert to a mixed array of objects and arrays
  flatten, // flatten to an array of objects
  pr(keyBy, 'algo_id'), // convert to object with algo_id as key
  pr(mapValues, pr(omit, 'algo_id')), // remove algo_id from the sub objects
);

const original = {"8":[{"temp":{"a":1},"algo_id":1},{"temp":{"a":2},"algo_id":101}],"13":{"temp":{"temp1":[1,2]},"algo_id":2}};

const result = fn(original);

console.log(result);
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...