为了账号安全,请及时绑定邮箱和手机立即绑定

JS:像SQL一样查询JSON数据

JS:像SQL一样查询JSON数据

回首忆惘然 2023-08-18 17:14:52
我有以下 JSON 数据{  "pebble" {     "status" : "active"   },  "stone" {     "status" : "active"   },  "stone_ny" {     "status" : "active"   },  "stone_london" {     "status" : "active"   },  "stone_tokyo" {     "status" : "active"   }}在JS中,有没有办法获取与stone_.*匹配的所有行并返回最后3行?
查看完整描述

5 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

只需使用一个简单的正则表达式来匹配石钥匙,/stone_/gi方法如下:


var names = {

    "pebble": {

        "status": "active"

    },

    "stone": {

        "status": "active"

    },

    "stone_ny": {

        "status": "active"

    },

    "stone_london": {

        "status": "active"

    },

    "stone_tokyo": {

        "status": "active"

    }

}


var matchedNames = {};


for (name in names) {

    if (/stone_/gi.test(name)) {

        matchedNames[name] = names[name];

    }

}


console.log(matchedNames);

Explanation of regex:

  • g = 全局,匹配字符串中模式的所有实例,而不仅仅是一个

  • i = 不区分大小写(例如,/a/i 将匹配字符串“a”或“A”。


查看完整回答
反对 回复 2023-08-18
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

JSON 数据本质上具有 SQL 无法做到的灵活性。这就是它变得如此普遍的原因。


假设您的数据位于一个名为的变量中data


var data = {

    "pebble": {

        "status": "active"

    },

    "stone": {

        "status": "active"

    },

    "stone_ny": {

        "status": "active"

    },

    "stone_london": {

        "status": "active"

    },

    "stone_tokyo": {

        "status": "active"

    }

}

const result = Object.keys(data)

  .filter(key => key.match(/^stone_/) // This does the filtering (the WHERE clause)

  .map(key => { return {[key]: data[key]}}) // This returns your selected rows


查看完整回答
反对 回复 2023-08-18
?
萧十郎

TA贡献1815条经验 获得超13个赞

您可以使用for...in循环遍历所有可枚举字符串属性(包括继承一次)。您可以将其与正则表达式匹配结合起来,以检查密钥是否满足您的要求。

const data = {

  "pebble"      : { "status": "active" },

  "stone"       : { "status": "active" },

  "stone_ny"    : { "status": "active" },

  "stone_london": { "status": "active" },

  "stone_tokyo" : { "status": "active" },

};


const result = {};

for (const key in data) {

  if (key.match(/^stone_/)) result[key] = data[key];

}


console.log(result);

但是,如果您当前已经在使用库,您可以检查是否有助手存在。一个常见的名称是pickBy()接受对象和谓词(测试函数)。

在洛达什:

const result = _.pickBy(data, (_, key) => key.match(/^stone_/));

在拉姆达:

const result = R.pickBy((_, key) => key.match(/^stone_/), data);
// or: const result = R.pickBy(R.flip(R.test(/^stone_/)), data);

如果输入是对象,某些库也可能使用filter()并返回对象。


查看完整回答
反对 回复 2023-08-18
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

source={

  "pebble": {

     "status" : "active"

   },

  "stone": {

     "status" : "active"

   },

  "stone_ny" {

     "status" : "active"

   },

  "stone_london": {

     "status" : "active"

   },

  "stone_tokyo": {

     "status" : "active"

   }

};


rows = [];


for(var k in source)

 if(k.substr(0,6)=="stone_")

  rows.push({[k]:source[k]});


查看完整回答
反对 回复 2023-08-18
?
墨色风雨

TA贡献1853条经验 获得超6个赞

var data = {

    "pebble": {

        "status": "active"

    },

    "stone": {

        "status": "active"

    },

    "stone_ny": {

        "status": "active"

    },

    "stone_london": {

        "status": "active"

    },

    "stone_tokyo": {

        "status": "active"

    }

}


const query = Object.entries(data).reduce((acc, val)=> {

  return val[0].slice(0, 6) === 'stone_' ? {...acc,  [val[0]]: val[1]} : acc

}, {})


查看完整回答
反对 回复 2023-08-18
  • 5 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信