Как динамически изменить ключ JSON (включая его дочерние ключи) в Javascript? - PullRequest
0 голосов
/ 21 декабря 2018

Я получаю JSON с конечной точки и хотел бы вставить его в базу данных mongoDB.Проблема в том, что некоторые ключи, которые приходят из JSON, имеют "."внутри него и mongoDB выдает ошибку, когда он предполагает вставить ключ такого типа, например:

object: {
"DR.No": 1
}

Это фактическая конечная точка, которую я получаю: https://api.opensea.io/api/v1/asset_contracts/ Это массив объектову некоторых из них есть объект «черты», который иногда имеет такие значения ключа (Ctrl + F и поиск «DR.», чтобы понять, что я имею в виду).

Когда я удалил этот раздел, все работалоЧто ж.

app.post("/something", (req, res, next) => {
   fetch("https://api.opensea.io/api/v1/asset_contracts/")
  .then(r => r.json())
  .then(data => {
    for (let i = 0; i < data.length; i++) {
      delete  data[i].traits; //works when deleted, I need it though
      ...

Мне нужен раздел черт.Я хотел бы заменить все точки запятыми.Поэтому мне нужно динамически менять имя ключа и его дочерних ключей.

Подобные вопросы сосредоточены больше на том, как включить.участвовать в mongoDB, чем динамически менять ключ (это решение, которое я хочу)

Ответы [ 2 ]

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

Один из возможных способов сделать это - переписать ключи в новый объект, например, так:

let obj = {};
let o = { "DR.No":1, "foo": 2 };
let keys = Object.keys(o);
for(let i = 0;i < keys.length;i++) {  
    let key = keys[i];
    obj[key.replace(".",",")] = o[key] 
}
JSON.stringify(obj,null,2)

"{
  "DR,No": 1,
  "foo": 2
}"

Или, если точек много:

let obj = {};
let o = { "DR.No.Blah.Dots.ToMany":1, "Weird.Dots.In.Keys": 2 };
let keys = Object.keys(o);
for(let i = 0;i < keys.length;i++) {  
    let key = keys[i];
    let originalKey = key;
    key = key.split(".").join(",");
    obj[key] = o[originalKey] 
}
JSON.stringify(obj,null,2)
"{
  "DR,No,Blah,Dots,ToMany": 1,
  "Weird,Dots,In,Keys": 2
}"

Если вы хотитеключи, которые не имеют пунктуации в них, избавляют от запятых ....

.... В ответ на ваш комментарий здесь один из возможных способов сделать это.Взяв образец из данных JSON в вашем вопросе:

 var data = [
    {
        "address": "0xde083e40fe84835cbbd6c69f6595cae1e85551dc",
        "name": "Ledger Legend Cards",
        "symbol": "LLC",
        "image_url": "https://storage.googleapis.com/opensea-static/ledgerlegends-logo.png",
        "featured_image_url": null,
        "featured": false,
        "description": "Ledger Legends is an early access collectible card game built on the Ethereum platform. It uses the new ERC721 non-fungible token standard to track its cards. Using this standard makes it easy for the cards to integrate into the wider Ethereum ecosystem, like exchanges and wallets. Being a card game that is built using smart contracts you know that your cards will always be owned by you and can never be taken away by anyone unlike centralized games such as Hearthstone.",
        "external_link": "https://ledgerlegends.com/",
        "wiki_link": null,
        "stats": {
            "seven_day_volume": 0,
            "seven_day_change": 0,
            "total_volume": 0,
            "count": 282,
            "num_owners": 54,
            "market_cap": 0,
            "average_price": 0,
            "items_sold": 0
        },
        "traits": [
            {
                "FN.RA.NA": "Value A",
                "RR.TT.DD": "Value B",
            },
            {
                "FN.RA.NA": "Value A",
                "RR.TT.DD": "Value B",
            },
            {
                "FN.RA.NA": "Value A",
                "RR.TT.DD": "Value B",
            },
            {
                "FN.RA.NA": "Value A",
                "RR.TT.DD": "Value B",
                "MORE.MORE.MORE": [
                    {
                        "FN.RA.NA": "Value A",
                        "RR.TT.DD": "Value B",
                    },
                    {
                        "FN.RA.NA": "Value A",
                        "RR.TT.DD": "Value B",
                    },
                    {
                        "FN.RA.NA": "Value A",
                        "RR.TT.DD": "Value B",
                    },
                    {
                        "FN.RA.NA": "Value A",
                        "RR.TT.DD": "Value B",
                    }
                ]
            }
        ],
        "hidden": true,
        "nft_version": "1.0",
        "schema_name": "ERC721",
        "display_data": {
            "images": [
                "https://ledgerlegends.com/img/monster.png",
                "https://ledgerlegends.com/img/monster.png",
                "https://ledgerlegends.com/img/monster.png",
                "https://ledgerlegends.com/img/monster.png",
                "https://ledgerlegends.com/img/monster.png",
                "https://ledgerlegends.com/img/monster.png"
            ]
        },
        "short_description": null,
        "total_supply": null,
        "owner": null,
        "buyer_fee_basis_points": 0,
        "seller_fee_basis_points": 250
    }

];

//is it an object
function isObject(o) {
    return Object.prototype.toString.call(o) === "[object Object]";
}
//is it an array
function isArray(o) {
    return Array.isArray(o);
}
//clean the keys and take advantage of the reference to the original 
    //object to re write and replace the keys and their values
    function cleanKeys(o) {
        var keys = Object.keys(o);
        for (var i = 0; i < keys.length; i++) {
            var key = keys[i];
            var toCheck = o[key];
            var originalKey = key;
            //if there is a dot in the key
            //re write it and replace it
            if (key.indexOf('.') > -1) {
                key = key.split(".").join(",");
                o[key] = o[originalKey];
                delete o[originalKey];
            }
            if (isArray(toCheck) || isObject(toCheck)) {
                removeDots(toCheck);
            }
        }
    }
//a somewhat recursive function with bits broken out for readability 
function removeDots(obj) {
    switch (Object.prototype.toString.call(obj)) {
        case "[object Array]":
            for (var i = 0; i < obj.length; i++) {
                var o = obj[i];
                if (isArray(o)) {
                    removeDots(obj);
                } else {
                    cleanKeys(o);
                }
            }
            break;
        case "[object Object]":
            cleanKeys(obj);
            break;
    }
}
removeDots(data);


console.log(JSON.stringify(data, null, 2));



 [
  {
    "address": "0xde083e40fe84835cbbd6c69f6595cae1e85551dc",
    "name": "Ledger Legend Cards",
    "symbol": "LLC",
    "image_url": "https://storage.googleapis.com/opensea-static/ledgerlegends-logo.png",
    "featured_image_url": null,
    "featured": false,
    "description": "Ledger Legends is an early access collectible card game built on the Ethereum platform. It uses the new ERC721 non-fungible token standard to track its cards. Using this standard makes it easy for the cards to integrate into the wider Ethereum ecosystem, like exchanges and wallets. Being a card game that is built using smart contracts you know that your cards will always be owned by you and can never be taken away by anyone unlike centralized games such as Hearthstone.",
    "external_link": "https://ledgerlegends.com/",
    "wiki_link": null,
    "stats": {
      "seven_day_volume": 0,
      "seven_day_change": 0,
      "total_volume": 0,
      "count": 282,
      "num_owners": 54,
      "market_cap": 0,
      "average_price": 0,
      "items_sold": 0
    },
    "traits": [
      {
        "FN,RA,NA": "Value A",
        "RR,TT,DD": "Value B"
      },
      {
        "FN,RA,NA": "Value A",
        "RR,TT,DD": "Value B"
      },
      {
        "FN,RA,NA": "Value A",
        "RR,TT,DD": "Value B"
      },
      {
        "FN,RA,NA": "Value A",
        "RR,TT,DD": "Value B",
        "MORE,MORE,MORE": [
          {
            "FN,RA,NA": "Value A",
            "RR,TT,DD": "Value B"
          },
          {
            "FN,RA,NA": "Value A",
            "RR,TT,DD": "Value B"
          },
          {
            "FN,RA,NA": "Value A",
            "RR,TT,DD": "Value B"
          },
          {
            "FN,RA,NA": "Value A",
            "RR,TT,DD": "Value B"
          }
        ]
      }
    ],
    "hidden": true,
    "nft_version": "1.0",
    "schema_name": "ERC721",
    "display_data": {
      "images": [
        "https://ledgerlegends.com/img/monster.png",
        "https://ledgerlegends.com/img/monster.png",
        "https://ledgerlegends.com/img/monster.png",
        "https://ledgerlegends.com/img/monster.png",
        "https://ledgerlegends.com/img/monster.png",
        "https://ledgerlegends.com/img/monster.png"
      ]
    },
    "short_description": null,
    "total_supply": null,
    "owner": null,
    "buyer_fee_basis_points": 0,
    "seller_fee_basis_points": 250
  }
]
0 голосов
/ 21 декабря 2018

возможно

data[i].traits = Object.entries(data[i].traits).reduce((memo, [key, value]) => {
  memo[key.replace(/./g, ',')] = value;
  return memo;
}, {});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...