简体   繁体   English

根据元素名称停止深度嵌套的 JSON 数组项/对象

[英]Stop Deeply Nested JSON Array Items/Objects Based on Element Name

So, I'm relatively new to javascript, and I'm working with a client-side javascript function that inserts JSON results pushed to it from the server. So, I'm relatively new to javascript, and I'm working with a client-side javascript function that inserts JSON results pushed to it from the server.

I would like to stop certain results, independently of that javascript that populating the results.我想停止某些结果,与填充结果的 javascript 无关。

Usually, if the js was my own, I'd make a guess that I'd use the "splice" function to remove the JSON array entry(ies) that I don't wish to be there, does that sound about right?通常,如果 js 是我自己的,我会猜测我会使用“拼接”function 来删除我不希望出现的 JSON 数组条目,这听起来对吗? (I'd got to there through plenty of searching on StartPage and here) (我通过在 StartPage 和这里的大量搜索到达那里)

However, I need whatever function I (let's be honest, "you") come up with to trump the embedded results.但是,我需要任何 function 我(老实说,“你”)想出胜过嵌入式结果。

Essentially this is normal behaviour: Webpage > JavaScript Parses JSON for Initial Results then Webpage > Scroll > JavaScript Parses JSON for More Results Essentially this is normal behaviour: Webpage > JavaScript Parses JSON for Initial Results then Webpage > Scroll > JavaScript Parses JSON for More Results

I'd like to insert something that will stop any JSON items that I don't like.我想插入一些东西来阻止我不喜欢的任何 JSON 项目。 I don't know how to represent that, I'd assume: Worker in Extension/Add-On > Webpage > etc I doubt this can be done with CSS... but that'd be awesome, as I'd just put it in my personal.我不知道如何表示,我假设: Worker in Extension/Add-On > Webpage > etc 我怀疑这可以用 CSS 来完成......但这太棒了,正如我刚才所说它在我的个人。

If it was splice, I'd have a vague idea (but really I'm flying blind) of how to do it on a base level with splice, but I'm already struggling, and that would deepen for the insanely deeply embedded objects I'm trying to exclude.如果是拼接,我会有一个模糊的想法(但我真的是瞎了眼)如何在拼接的基础上做到这一点,但我已经在苦苦挣扎了,这对于疯狂地深深嵌入的对象来说会加深我试图排除。


So.所以。 There is lot of json data in the section I'm looking at.我正在查看的部分中有很多json 数据。

I'm purely concentrated on the removing of the array here, but by end goal is two parts:我完全专注于在这里删除数组,但最终目标是两个部分:

  1. In the ' contents ' array in levelOneB 's ' daContentShaper ' I would like to remove any item from the array where in the sub-object ' content ' there is an element called ' contentTypeA '.levelOneB的“ daContentShaper ”中的“ contents ”数组中,我想从数组中删除子对象“ content ”中有一个名为“ contentTypeA ”的元素的任何项目。 There's another object with the label ' ahThisIsTheBContent ', which I'd also like gone, and that's dotted through the JSON.还有另一个 object 和 label ' ahThisIsTheBContent ',我也希望它消失了,它点缀在 JSON 中。 All other items (TypeB, TypeC, or other) must stay.所有其他项目(TypeB、TypeC 或其他)必须保留。
  2. Additionally, within said ' content ' object I would like to change any ' visible ' values that are " false " to " true ".此外,在所述“ content ”object 中,我想将“ false ”的任何“ visible ”值更改为“ true ”。

It's definitely possible, it's just working out how to ensure that the rest of the code (which may have similar - not the same - parts elsewhere) isn't affected by my splice of this array.这绝对是可能的,它只是在研究如何确保代码的 rest (在其他地方可能有类似 - 不一样 - 部分)不受我的这个数组拼接的影响。

{
    "levelOneA": {
        "levelOneAArr": [ { "name": "me", "age": 1 }, { "name": "you", "age": 2 }, { "name": "them", "age": 3 } ],
        "levelOneAText": "blah"
    },
    "levelOneB": {
        "levelOneBDeepBro": {
            "levelOneBDeepBroTabs": [
                {
                    "levelOneBDeepBroTabsShaper": {
                        "isBlessed": true,
                        "daContent": {
                            "daContentShaper": {
                                "contents": [
                                    {
                                        "contentItem": {
                                            "content": {
                                                "contentTypeA": {
                                                    "bitA": "bitAText",
                                                    "bitB": [
                                                        {
                                                            "bitBText1": "cripes"
                                                        },
                                                        {
                                                            "bitBText1": "crikey"
                                                        },
                                                        {
                                                            "bitBText1": "crimeny"
                                                        }
                                                    ],
                                                    "visible": true
                                                }
                                            },
                                            "extraNonsense": "bingoBlah"
                                        }
                                    },
                                    {
                                        "contentItem": {
                                            "content": {
                                                "ahThisIsTheBContent": {
                                                    "bitA": "bitAText",
                                                    "bitB": [
                                                        {
                                                            "bitBText1": "cripes"
                                                        },
                                                        {
                                                            "bitBText1": "crikey"
                                                        },
                                                        {
                                                            "bitBText1": "crimeny"
                                                        }
                                                    ],
                                                    "visible": false
                                                }
                                            },
                                            "extraNonsense": "bingoBlahBlah"
                                        }
                                    },
                                    {
                                        "contentItem": {
                                            "content": {
                                                "contentTypeB": {
                                                    "bitA": "bitAText",
                                                    "bitB": [
                                                        {
                                                            "bitBText1": "jinkies"
                                                        },
                                                        {
                                                            "bitBText1": "ruh roh"
                                                        },
                                                        {
                                                            "bitBText1": "like, wow"
                                                        }
                                                    ],
                                                    "visible": true
                                                }
                                            },
                                            "extraNonsense": "bingoBlahBlah"
                                        }
                                    },
                                    {
                                        "contentItem": {
                                            "content": {
                                                "contentTypeC": {
                                                    "bitA": "bitAText",
                                                    "bitB": [
                                                        {
                                                            "bitBText1": "cripes"
                                                        },
                                                        {
                                                            "bitBText1": "crikey"
                                                        },
                                                        {
                                                            "bitBText1": "crimeny"
                                                        }
                                                    ],
                                                    "visible": true
                                                }
                                            },
                                            "extraNonsense": "bingoBlahBlahBlah"
                                        }
                                    }
                                ],
                                "myDadIsBetter": "Go Faster Stripes, innit."
                            }
                        },
                        "tabId": "Bro"
                    }
                }
            ]
        }
    },
    "levelOneC": "CAAQhGciEwi0iqD5-ZbwAhUBPvEFHQMKAeo=",
    "levelOneD": {
        "iAmJustHappyToBeNominated": "innit",
        "damnYourWholePopCultureSubsection": "flames abound"
    }
}

This is how you could solve this using object-scan这就是使用对象扫描解决此问题的方法

Note that I used quite a few ** in the matching.请注意,我在匹配中使用了很多** You could write these out exactly, it depends on your requirement您可以准确地写出这些,这取决于您的要求

 // const objectScan = require('object-scan'); const data = { levelOneA: { levelOneAArr: [{ name: 'me', age: 1 }, { name: 'you', age: 2 }, { name: 'them', age: 3 }], levelOneAText: 'blah' }, levelOneB: { levelOneBDeepBro: { levelOneBDeepBroTabs: [ { levelOneBDeepBroTabsShaper: { isBlessed: true, daContent: { daContentShaper: { contents: [ { contentItem: { content: { contentTypeA: { bitA: 'bitAText', bitB: [ { bitBText1: 'cripes' }, { bitBText1: 'crikey' }, { bitBText1: 'crimeny' } ], visible: true } }, extraNonsense: 'bingoBlah' } }, { contentItem: { content: { ahThisIsTheBContent: { bitA: 'bitAText', bitB: [ { bitBText1: 'cripes' }, { bitBText1: 'crikey' }, { bitBText1: 'crimeny' } ], visible: false } }, extraNonsense: 'bingoBlahBlah' } }, { contentItem: { content: { contentTypeB: { bitA: 'bitAText', bitB: [ { bitBText1: 'jinkies' }, { bitBText1: 'ruh roh' }, { bitBText1: 'like, wow' } ], visible: false } }, extraNonsense: 'bingoBlahBlah' } }, { contentItem: { content: { contentTypeC: { bitA: 'bitAText', bitB: [ { bitBText1: 'cripes' }, { bitBText1: 'crikey' }, { bitBText1: 'crimeny' } ], visible: false } }, extraNonsense: 'bingoBlahBlahBlah' } } ], myDadIsBetter: 'Go Faster Stripes, innit.' } }, tabId: 'Bro' } } ] } }, levelOneC: 'CAAQhGciEwi0iqD5-ZbwAhUBPvEFHQMKAeo=', levelOneD: { iAmJustHappyToBeNominated: 'innit', damnYourWholePopCultureSubsection: 'flames abound' } }; const logic = { 'levelOneB.**.daContentShaper.contents[*].*.content.{contentTypeA,ahThisIsTheBContent}': ({ key, parents }) => { parents[3].splice(key[key.length - 4], 1); }, 'levelOneB.**.daContentShaper.contents.**.visible': ({ value, parent, property }) => { if (value === false) { parent[property] = true; } } }; const modify = objectScan(Object.keys(logic), { rtn: 'count', filterFn: ({ matchedBy, property, key, value, parent, parents }) => { matchedBy.forEach((m) => logic[m]({ property, key, value, parent, parents })); } }); console.log(modify(data)); // => 6 console.log(data); // => { levelOneA: { levelOneAArr: [ { name: 'me', age: 1 }, { name: 'you', age: 2 }, { name: 'them', age: 3 } ], levelOneAText: 'blah' }, levelOneB: { levelOneBDeepBro: { levelOneBDeepBroTabs: [ { levelOneBDeepBroTabsShaper: { isBlessed: true, daContent: { daContentShaper: { contents: [ { contentItem: { content: { contentTypeB: { bitA: 'bitAText', bitB: [ { bitBText1: 'jinkies' }, { bitBText1: 'ruh roh' }, { bitBText1: 'like, wow' } ], visible: true } }, extraNonsense: 'bingoBlahBlah' } }, { contentItem: { content: { contentTypeC: { bitA: 'bitAText', bitB: [ { bitBText1: 'cripes' }, { bitBText1: 'crikey' }, { bitBText1: 'crimeny' } ], visible: true } }, extraNonsense: 'bingoBlahBlahBlah' } } ], myDadIsBetter: 'Go Faster Stripes, innit.' } }, tabId: 'Bro' } } ] } }, levelOneC: 'CAAQhGciEwi0iqD5-ZbwAhUBPvEFHQMKAeo=', levelOneD: { iAmJustHappyToBeNominated: 'innit', damnYourWholePopCultureSubsection: 'flames abound' } }
 .as-console-wrapper {max-height: 100%;important: top: 0}
 <script src="https://bundle.run/object-scan@14.3.0"></script>

Disclaimer : I'm the author of object-scan免责声明:我是对象扫描的作者

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM