dqxsuig64994 2019-01-09 09:56 采纳率: 0%
浏览 1536

有没有类似于PHP array_column的Javascript函数?

I am using Vue.js

What I want is to get one column named 'name' from the multidimensional array.

I am not sure the dimensional size of this multidimensional array.

Sample array is here

{
    "form":{
        "id":"123465",
        "title":"User Information",
        "fields":[
                    {
                        "type":"date",
                        "title":"Document date",
                        "name":"document_date",
                        "required":true
                    },
                    {
                        "type":"input",
                        "title":"Document no",
                        "name":"document_no",
                        "required":true
                    }
                ],
        "tabs":{
            "xxx-general":{
                "title":"General",
                "fields":[
                    {
                        "type":"date",
                        "title":"DOB",
                        "name":"dob"
                    },
                    {
                        "type":"toggle",
                        "title":"Keep my profile private",
                        "name":"is_private"
                    },
                ]
            },
            "xxx-times":{
                "title":"Ticket",
                "fields":[
                    {
                        "type":"datetime",
                        "title":"Arrival time",
                        "name":"arrival_time"
                    },
                    [
                        {"type":"number","title":"Quantity","name":"quantity"},
                        {"type":"currency","title":"Price","name":"price"}
                    ]
                ]
            }
        }
    }
}

I know there is array_column function in PHP, I want to use the javascript function equivalent to this PHP function.

Anyone helps me

  • 写回答

4条回答 默认 最新

  • dongyue5686 2019-01-09 10:11
    关注

    there is no a native method to do perform a deep find but implementation is actually pretty easy:

    //return an array of objects according to key, value, or key and value matching
    function getObjects(obj, key, val) {
        var objects = [];
        for (var i in obj) {
            if (!obj.hasOwnProperty(i)) continue;
            if (typeof obj[i] == 'object') {
                objects = objects.concat(getObjects(obj[i], key, val));    
            } else 
            //if key matches and value matches or if key matches and value is not passed (eliminating the case where key matches but passed value does not)
            if (i == key && obj[i] == val || i == key && val == '') { //
                objects.push(obj);
            } else if (obj[i] == val && key == ''){
                //only add if the object is not already in the array
                if (objects.lastIndexOf(obj) == -1){
                    objects.push(obj);
                }
            }
        }
        return objects;
    }
    
    //return an array of values that match on a certain key
    function getValues(obj, key) {
        var objects = [];
        for (var i in obj) {
            if (!obj.hasOwnProperty(i)) continue;
            if (typeof obj[i] == 'object') {
                objects = objects.concat(getValues(obj[i], key));
            } else if (i == key) {
                objects.push(obj[i]);
            }
        }
        return objects;
    }
    
    //return an array of keys that match on a certain value
    function getKeys(obj, val) {
        var objects = [];
        for (var i in obj) {
            if (!obj.hasOwnProperty(i)) continue;
            if (typeof obj[i] == 'object') {
                objects = objects.concat(getKeys(obj[i], val));
            } else if (obj[i] == val) {
                objects.push(i);
            }
        }
        return objects;
    }
    
    
    var json = '{"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","ID":"44","str":"SGML","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}}';
    
    var js = JSON.parse(json);
    
    //example of grabbing objects that match some key and value in JSON
    console.log(getObjects(js,'ID','SGML'));
    //returns 1 object where a key names ID has the value SGML
    
    //example of grabbing objects that match some key in JSON
    console.log(getObjects(js,'ID',''));
    //returns 2 objects since keys with name ID are found in 2 objects
    
    //example of grabbing obejcts that match some value in JSON
    console.log(getObjects(js,'','SGML'));
    //returns 2 object since 2 obects have keys with the value SGML
    
    //example of grabbing objects that match some key in JSON
    console.log(getObjects(js,'ID',''));
    //returns 2 objects since keys with name ID are found in 2 objects
    
    //example of grabbing values from any key passed in JSON
    console.log(getValues(js,'ID'));
    //returns array ["SGML", "44"] 
    
    //example of grabbing keys by searching via values in JSON
    console.log(getKeys(js,'SGML'));
    //returns array ["ID", "SortAs", "Acronym", "str"] 

    Ref: http://techslides.com/how-to-parse-and-search-json-in-javascript

    </div>
    
    评论

报告相同问题?

悬赏问题

  • ¥15 正弦信号发生器串并联电路电阻无法保持同步怎么办
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序