Как извлечь данные из сложного Javascript объекта? - PullRequest
0 голосов
/ 12 февраля 2020

Предположим, у меня есть следующий фрагмент кода Javascript.

let data = {
    "ethusd": {
        "at": 1581416882,
        "ticker": {
            "buy": "218.87",
            "sell": "219.0",
            "low": "0.0",
            "high": "0.0",
            "open": 209.09,
            "last": "0.0",
            "volume": "72877.8789",
            "avg_price": "213.699103431748658920247612509",
            "price_change_percent": "-100.00%",
            "vol": "72877.8789"
        }
    },
    "trstusd": {
        "at": 1581416882,
        "ticker": {
            "buy": "0.0",
            "sell": "0.0",
            "low": "0.0",
            "high": "0.0",
            "open": "0.0",
            "last": "0.0",
            "volume": "0.0",
            "avg_price": "0.0",
            "price_change_percent": "+0.00%",
            "vol": "0.0"
        }
    },
    "trsteth": {
        "at": 1581416882,
        "ticker": {
            "buy": "0.0",
            "sell": "0.0",
            "low": "0.0",
            "high": "0.0",
            "open": "0.0",
            "last": "0.0",
            "volume": "0.0",
            "avg_price": "0.0",
            "price_change_percent": "+0.00%",
            "vol": "0.0"
        }
    }
}


for (let element in data)
{
	let innerElement = data[element];
	
	for (let innerData in innerElement)
	{
		if (innerData !== "at")
		{
			let internalData = innerElement[innerData];

			for (let x in internalData)
			{
				console.log(x,internalData[x]);
			}
		}
	}
}

То, что я пробовал в этом коде выше, это получить значение покупки и продажи, в частности. Таким образом, я написал код таким образом. Это хороший способ извлечь данные из объекта javascript или формата данных JSON? Если нет, каковы эффективные способы и передовые практики?

Ответы [ 3 ]

2 голосов
/ 12 февраля 2020

Это зависит от того, что вы хотите сделать.

Например, если вам нужно взять все тикеры каждого обмена:

for(let exchange in data) {
    var ticker = data[exchange]["ticker"];
    console.log(ticker);
    // maybe here you can creare row of a table? (example)
}

or..

for(let exchange in data) {
    var ticker = data[exchange].ticker;
    console.log(ticker);
    // maybe here you can creare row of a table? (example)
}

Если вы хотите получить доступ к тикеру вместо этого указывается c exchange:

var ticker = data["ethusd"]["ticker"];

or..
var ticker = data.ethusd["ticker"];

or..
var ticker = data.ethusd.ticker;

Очевидно, вам необходимо проверить, существует ли поле:

var exist = typeof data.ethusd !== 'undefined' && data.ethusd !== null;

or..
var exist = typeof data["ethusd"] !== 'undefined' && data["ethusd"] !== null;

or..
var exist = (!!data.ethusd);

or..
var exist = (!!data["ethusd"]);

Это простой Javascript объект, доступ к которому можно получить через поле объекта или через имя поля как «ключ» словаря.

1 голос
/ 12 февраля 2020

Что касается читабельности, я бы go с loda sh.

  1. Если вы знаете путь этого buy и sell, то вы ' ищите, вы можете использовать ._get, то есть:

    _.get(data, 'ethusd.ticker.buy')
    _.get(data, 'trstusd.ticker.sell')
    
  2. Если вы не знаете точный путь, вы можете использовать _. findKey

Что касается эффективности, деконструкция вручную, вероятно, будет быстрее, как продемонстрировано , но мы говорим о миллионах выполнений в секунду в обоих сценариях ios ... Я иду с удобочитаемостью, еще раз. : -)

1 голос
/ 12 февраля 2020
let data = {
    "ethusd": {
        "at": 1581416882,
        "ticker": {
            "buy": "218.87",
            "sell": "219.0",
            "low": "0.0",
            "high": "0.0",
            "open": 209.09,
            "last": "0.0",
            "volume": "72877.8789",
            "avg_price": "213.699103431748658920247612509",
            "price_change_percent": "-100.00%",
            "vol": "72877.8789"
        }
    },
    "trstusd": {
        "at": 1581416882,
        "ticker": {
            "buy": "0.0",
            "sell": "0.0",
            "low": "0.0",
            "high": "0.0",
            "open": "0.0",
            "last": "0.0",
            "volume": "0.0",
            "avg_price": "0.0",
            "price_change_percent": "+0.00%",
            "vol": "0.0"
        }
    },
    "trsteth": {
        "at": 1581416882,
        "ticker": {
            "buy": "0.0",
            "sell": "0.0",
            "low": "0.0",
            "high": "0.0",
            "open": "0.0",
            "last": "0.0",
            "volume": "0.0",
            "avg_price": "0.0",
            "price_change_percent": "+0.00%",
            "vol": "0.0"
        }
    }
}

let valueOfKeysToFound = ['buy', 'sell'];
let simpleObjSubset = [];

function scrapData(obj, valueOfKeysToFound) {
    if (typeof obj === 'object') {
        let tempValues = {};
        let keyFoundCount = 0;

        for (let property in obj) {
            let value = obj[property];

            if (typeof value === 'object') {
                scrapData(value, valueOfKeysToFound);
            } else if (valueOfKeysToFound.includes(property)) {
                tempValues[property] = value;
                keyFoundCount++;

                if (keyFoundCount == valueOfKeysToFound.length) {
                    simpleObjSubset.push(tempValues);
                    break;
                }
            }
        }
    } 
}

scrapData(data, valueOfKeysToFound);
console.table(simpleObjSubset);

Когда кто-то говорит «эффективный», это означает достаточно надежный с точки зрения производительности, а когда кто-то говорит «хорошая практика», он неоднозначен от человека к человеку, проблема к проблеме и логика c к логикам c.

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

  • Я знаю, что делает каждая строка.
  • Она может масштабироваться.
  • Она может проверять число N глубины.

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

...