深层对象的getPathValue()函数 [英] getPathValue() function for deep objects

查看:74
本文介绍了深层对象的getPathValue()函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个后续问题:
getPathValue()函数用于包含数组和压缩JSON的深层对象

在大多数情况下,接受的答案非常有效:

The accepted answer works very well in most situations:

function getPathValue(object, path) {
    return path
       .replace(/\[/g, '.')
       .replace(/\]/g, '')
       .split('.')
       .reduce(function (o, k) {
           return (typeof o === 'string' ? JSON.parse(o) : (o || {}))[k];
       }, object);
}

我现在有了新的要求。我需要它来处理根级别的数组。例如,此对象:

I now have a new requirement. I need it to work with arrays in the root level. For example, this object:

[{"currencyPair":"EUR/USD","timestamp":"1546028298698","bidBig":"1.14","bidPips":"450","offerBig":"1.14","offerPips":"457","high":"1.14253","low":"1.14732","open":"1.14305"},{"currencyPair":"USD/JPY","timestamp":"1546028299095","bidBig":"110.","bidPips":"326","offerBig":"110.","offerPips":"336","high":"110.222","low":"111.062","open":"111.012"},{"currencyPair":"GBP/USD","timestamp":"1546028246468","bidBig":"1.26","bidPips":"974","offerBig":"1.26","offerPips":"988","high":"1.26350","low":"1.27087","open":"1.26505"},{"currencyPair":"EUR/GBP","timestamp":"1546028296658","bidBig":"0.90","bidPips":"127","offerBig":"0.90","offerPips":"140","high":"0.90034","low":"0.90601","open":"0.90355"},{"currencyPair":"USD/CHF","timestamp":"1546028296551","bidBig":"0.98","bidPips":"470","offerBig":"0.98","offerPips":"481","high":"0.97896","low":"0.99113","open":"0.98854"},{"currencyPair":"EUR/JPY","timestamp":"1546028299289","bidBig":"126.","bidPips":"322","offerBig":"126.","offerPips":"336","high":"126.256","low":"127.204","open":"127.008"},{"currencyPair":"EUR/CHF","timestamp":"1546028296543","bidBig":"1.12","bidPips":"714","offerBig":"1.12","offerPips":"726","high":"1.12146","low":"1.13180","open":"1.12920"},{"currencyPair":"USD/CAD","timestamp":"1546028299908","bidBig":"1.36","bidPips":"470","offerBig":"1.36","offerPips":"485","high":"1.35946","low":"1.36613","open":"1.36142"},{"currencyPair":"AUD/USD","timestamp":"1546028296222","bidBig":"0.70","bidPips":"445","offerBig":"0.70","offerPips":"453","high":"0.70238","low":"0.70695","open":"0.70288"},{"currencyPair":"GBP/JPY","timestamp":"1546028297767","bidBig":"140.","bidPips":"123","offerBig":"140.","offerPips":"148","high":"139.495","low":"140.628","open":"140.462"}]

我想保留以前接受的答案的所有功能,但另外,我'我希望能够检索特定的数组元素甚至特定的键值在特定的数组元素内。例如,

I want to retain all of the functionality of the previously accepted answer, but in addition, I'd like to be able to retrieve specific array elements and even specific key values within specific array elements. For example,

value = getPathValue(obj, '[0]');

...只返回此字符串:

...which should return only this string:

{"currencyPair":"EUR/USD","timestamp":"1546028298698","bidBig":"1.14","bidPips":"450","offerBig":"1.14","offerPips":"457","high":"1.14253","low":"1.14732","open":"1.14305"}

value = getPathValue(obj, '[3].bidPips');

...将返回:

"0.90"


推荐答案

更改:

.split('.')

按:

.split('.').filter(Boolean)

它将修复一个放在字符串最开头的点,这是什么输入以 [开头,如 [0] 开始时发生。

It will remedy a dot that got placed at the very beginning of the string, which is what happens when the input starts with a [, like in [0].

演示:

function getPathValue(object, path) {
    return path
       .replace(/\[/g, '.')
       .replace(/\]/g, '')
       .split('.').filter(Boolean)
       .reduce(function (o, k) {
           return (typeof o === 'string' ? JSON.parse(o) : (o || {}))[k];
       }, object);
}

var obj = [{"currencyPair":"EUR/USD","timestamp":"1546028298698","bidBig":"1.14","bidPips":"450","offerBig":"1.14","offerPips":"457","high":"1.14253","low":"1.14732","open":"1.14305"},{"currencyPair":"USD/JPY","timestamp":"1546028299095","bidBig":"110.","bidPips":"326","offerBig":"110.","offerPips":"336","high":"110.222","low":"111.062","open":"111.012"}];

value = getPathValue(obj, '[0].bidPips');

console.log(value);

通过更换替换和拆分通过一个匹配来电:

It can be done easier though, by replacing the replace and split calls by one match call:

function getPathValue(object, path) {
    return path
       .match(/[^[\].]+/g)
       .reduce(function (o, k) {
           return (typeof o === 'string' ? JSON.parse(o) : (o || {}))[k];
       }, object);
}

var obj = [{"currencyPair":"EUR/USD","timestamp":"1546028298698","bidBig":"1.14","bidPips":"450","offerBig":"1.14","offerPips":"457","high":"1.14253","low":"1.14732","open":"1.14305"},{"currencyPair":"USD/JPY","timestamp":"1546028299095","bidBig":"110.","bidPips":"326","offerBig":"110.","offerPips":"336","high":"110.222","low":"111.062","open":"111.012"}];
value = getPathValue(obj, '[0].bidPips');

console.log(value);

这篇关于深层对象的getPathValue()函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆