Конвертировать объект JSON в объект, который не в формате JSON - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть объект JSON со структурой, приведенной ниже

const inputObj = {
    "prop1": "val1",
    "prop2": {
        "prop2_1": "val2_1",
        "prop2_2": "val2_2"
    }
    "prop3": "val3"
}

Моя цель: я хотел бы взять свойство, включая вложенное свойство, и сохранить результат в файле txt, ноне в формате JSON.Для ясности вот мой ожидаемый результат в файле txt:

{
    prop1: {
        id: 'prop1'
    },
    prop2_prop2_1: {
        id: 'prop2.prop2_1'
    },
    prop2_prop2_2: {
        id: 'prop2.prop2_2'
    }
    prop3: {
        id: 'prop3'
    }
}

До сих пор я мог написать не вложенное свойство, но все еще не в той структуре, которую ожидал.Вот результат на данный момент:

{
    "prop1": "prop1",
    "prop3": "prop3"
}

Он все еще в формате JSON, а не в структуре, которую я ожидал, и вложенное свойство все еще не перехвачено (я все еще думаю, как его получить)

Здесь приведен код для создания моего текущего результата:

const fs = require('fs')
const fileName = "./results.txt"

function getAllKeys(obj, path = [], result = []) {
  Object.entries(obj).forEach(([k, v]) => {
    if (typeof v === 'object') getAllKeys(v, path.concat(k), result)
    else result.push(path.concat(k).join("."))
  })
  return result
}

const inputToFile = getAllKeys(inputObj)
// console.log(inputToFile)
// result of the console.log
// prop1
// prop2.prop2_1
// prop2.prop2_2
// prop3

const newObj = {}

for (var i = 0; i < inputToFile.length; i++) {
    var input = inputToFile[i]
    var dotIndex = input.indexOf('.') // to check if its from the nested JSON property of the inputObj
    if (dotIndex === -1) {
        // no dot or nested property in the JSON
        newObj[input] = input.toString()
    } else {
        // if the input contain dot, which is a nested JSON
    }
}

fs.writeFileSync(fileName, JSON.stringfy(newObj))
// if I use above line, the result in the file is as I had mention above. But, if the code is like below:
const finals = JSON.stringfy(newObj)
fs.writeFileSync(fileName, JSON.parse(finals))
// the output in the file is only "[Object object]" without double quote

Обновление Причина, по которой мне нужно отформатировать результат, заключается в том, что я хочу использовать реагировать-intl.У меня уже есть файл локали (перевод), который выглядит как inputObj (структура).Затем мне нужно создать файл, подобный этому (ниже), чтобы библиотека могла его перевести:

import { defineMessages } from 'react-intl';

const MessagesId = defineMessages({
  prop1: {
    id: 'prop1'
  },
  prop2_prop2_1: {
    id: 'prop2.prop2_1'
  },
  prop2_prop2_2: {
    id: 'prop2.prop2_2'
  },
  prop3: {
    id: 'prop3'
  }
})
export default MessagesId;

Поэтому мне нужно, чтобы он не был похож на JSON.Потому что у меня уже есть тысячи кодов для перевода, но мне нужно определить его в MessagesId.Было бы так много времени, если я сделаю это вручную .__.Ps: реагирует на это работает, проблема только конвертации, как мои первоначальные вопросы

1 Ответ

0 голосов
/ 19 декабря 2018

Этот скрипт может обрабатывать несколько уровней вложенных объектов.

const outputObj = {};
const convertNestedObj = (obj, parentKey = []) => {
  for (key in obj) {
    newParentKey = [...parentKey, key];
    if (typeof obj[key] === 'object') {
      convertNestedObj(obj[key], newParentKey);
    } else {
      outputObj[newParentKey.join('_')] = { id: newParentKey.join('_') };
    }
  }
};
convertNestedObj(inputObj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...