javascript - json筛选方法
PHP中文网
PHP中文网 2017-04-11 13:04:39
[JavaScript讨论组]

想写一个方法 从原始筛选出想要的

var testArr=[{
                "k1":{
                    "k3ad":"df",
                    "k0":{
                        "user":"xia0ming",
                        "age":"18"
                    },
                },
                "ke.name":"danshi"
            },{
                "k1":{
                    "k3ad":"dfsdf",
                    "k0":{
                        "user":"xia0ming",
                        "age":"28"
                    },
                },
                "ke.name":"dadfnshi"
            }];

var  getTbodyData= function (ajaxdata, filterArr) {
            var arr = [];
            ajaxdata.forEach(function (data, i) {
                arr.push({});
                filterArr.forEach(function (key) {
                   arr[i][key]=data[key]
                });
            });
            return arr;
        };

getTbodyData(testArr,["k1.k3ad","ke.name"])

比如我想筛选原json,结果为

[{
"k1.k3ad":"df",
"ke.name":"danshi"
},{
"k1.k3ad":"dfsdf",
"ke.name":"dadfnshi"

}]

但是我写的方法找到的k1.k3ad 为undefined如下

,求大神指导

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(4)
高洛峰
const testArr = [{
    "k1": {
        "k3ad": "df",
        "k0": {
            "user": "xia0ming",
            "age": "18"
        },
    },
    "ke.name": "danshi"
}, {
    "k1": {
        "k3ad": "dfsdf",
        "k0": {
            "user": "xia0ming",
            "age": "28"
        },
    },
    "ke.name": "dadfnshi"
}];

const res = [{
    "k1.k3ad": "df",
    "ke.name": "danshi"
}, {
    "k1.k3ad": "dfsdf",
    "ke.name": "dadfnshi"
}]

function getTbodyData(originArr, filter) {
    const rawArr = originArr.slice();
    const getFirstExist = function(data, item) {
        if (data[item]) {
            return data[item];
        } else {
            let index = item.indexOf('.');
            return index !== -1 ? getFirstExist(data[item.substring(0, index)], item.substring(index+1)) : undefined;
        }
    };

    return rawArr.reduce( (newArr, data) => {
        newArr.push(filter.reduce( (prev, item) => {
            prev[item] = getFirstExist(data, item);
            return prev;
        }, {}));
        return newArr;
    }, []);
}

function deepEqual(a, b) {
    return JSON.stringify(a) === JSON.stringify(b);
}

console.log(deepEqual(getTbodyData(testArr, ["k1.k3ad","ke.name"]), res));
ringa_lee

你能取到k3.ad完全是因为这个属性名就叫k3.ad啊,data[k1.k3ad] 并不等于 data.k1.k3ad,所以你这么写是无效的。

准确的说,你这个例子里,点运算符.和属性名内部的点并不能区分,k1.k3ad中是作为点运算符取属性,k3.ad中则是属性名自带的点,你告诉我这要函数怎么区分?

要实现这个功能的话首先还是修改你的json格式吧,或者把k1.k3ad这种需求情况下的参数改为[k1][k3ad]之类的格式。

PHPz
var getTbodyData = testArr.map(item => { 
    return { 'k1.k3ad': (item.k1 && item.k1.k3ad) || '无', 'ke.name': item['ke.name'] };
});
PHP中文网

根据你的方法进行的修改

var  getTbodyData= function (ajaxdata, filterArr) {
            var arr = [];
            ajaxdata.forEach(function (data, i) {
                arr.push({});
                filterArr.forEach(function (key) {
                    var k_arr = key.split('.'),k,a = arr[i],j = 0;
                    var d = data;

                    if(d[key]){
                        a[key] = d[key];
                    }else{
                        while(k = k_arr[j++]){
                            d = d[k];
                        }
                        a[key] = d;
                    }
                    
                    
                });
            });
            return arr;
        };
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号