获取JavaScript对象的字符串表示形式

获取JavaScript对象的字符串表示形式,javascript,Javascript,我有一个这样的目标: $scope.query = { filter: { column: { productName: 'Some Product', price: 29.95, ... }, table: { productType: 'GM', categoryId: 1, ...

我有一个这样的目标:

$scope.query = {
    filter: {
        column: {
            productName: 'Some Product',
            price: 29.95,
            ...
        },
        table: {
            productType: 'GM',
            categoryId: 1,
            ...
        }
    }
};
如何获得一个用点表示法表示整个对象的字符串?e、 g

query.filter.table.productType
为了澄清这一点,我使用这个字符串值作为键来在localStorage中存储一个键/值对


我使用angular to$wacth对对象上的每个属性进行更改。因为你不能观察一个对象,也不能知道哪个属性在观察所有对象时发生了变化,所以我需要创造性地将每个属性存储在一个键/值对中。

你可以递归地执行,并在数组中生成“键”

var obj = {
    query: {
        filter: {
            table: {
                productType: 'GM'
            }
        }
    }
};

var stringify = function (e) {
    var rs = [];
    for (var k in e) {
        if (e.hasOwnProperty(k)) {
            if (typeof e[k] == 'object') {
                var l = stringify(e[k]);
                for (var i = 0; i < l.length; i++) {
                    rs.push(k + '.' + l[i]);
                }
            } else {
                rs.push(k);
            }
        }
    }
    return rs;
}

console.log(stringify(obj));

编辑前

var $scope = {
    query: {
        filter: {
            table: {
                productType: 'GM'
            }
        }
    }
};

var k = JSON.stringify($scope)
//output "{"query":{"filter":{"table":{"productType":"GM"}}}}"

k.match(/\w+(?=\"\:)/g).join('.')
//output"query.filter.table.productType"
编辑

var $scope = {
    query: {
        filter: {
            table: {
                productType: 'GM'
            }
        }
    }
};

var k = JSON.stringify($scope)
//output "{"query":{"filter":{"table":{"productType":"GM"}}}}"

k.match(/\w+(?=\"\:)/g).join('.')
//output"query.filter.table.productType"

如果OP对子元素的位置没有问题

var $scope = {}
$scope.query = {
    filter: {
        column: {
            productName: 'Some Product',
            price: 29.95
        },
        table: {
            productType: 'GM',
            categoryId: 1,
        }
    }
};

k=JSON.stringify($scope)
{"query":{"filter":{"column":{"productName":"Some Product","price":29.95},"table":{"productType":"GM","categoryId":1}}}}

k.match(/\w+(?=\"\:)/g).join('.')
"query.filter.column.productName.price.table.productType.categoryId"

通过递归地将属性迭代到数组中,可以创建表示对象中数据的层次结构。从这里,您可以根据需要解析结果

var scope = {
    query: {
        filter: {
            column: {
                productName: 'Some Product',
                price: 29.95
            },
            table: {
                productType: 'GM',
                categoryId: 1
            }
        }
    }
};    
function buildProps(subject) {
    var result = [];
    for (var key in subject) {
        if (subject.hasOwnProperty(key)) {
            if (typeof subject[key] == "object") {
                result.push(key, buildProps(subject[key]));
            } else {
                result.push(key);
            }
        }
    }
    return result;
}    
function stringify(input) {
    var result = [];
    for (var i = 0; i < input.length; i++) {
        if (typeof input[i] == "string") {
            result.push(input[i]);
        } else {
            result = result.concat(stringify(input[i]));
        }
    }
    return result.join('.');
}

console.log(buildProps(scope));
console.log(stringify(buildProps(scope)));
var范围={
查询:{
过滤器:{
专栏:{
产品名称:“某些产品”,
价格:29.95
},
表:{
productType:'GM',
类别:1
}
}
}
};    
功能构建道具(主题){
var结果=[];
for(科目中的var键){
if(主体hasOwnProperty(键)){
if(主题类型[键]=“对象”){
结果.推(键,buildProps(主题[key]);
}否则{
结果:按(键);
}
}
}
返回结果;
}    
函数字符串化(输入){
var结果=[];
对于(变量i=0;i
解析出结果数组/子数组中的字符串,按照您喜欢的方式格式化它

在我的简单示例中,我只是按顺序列出它们:
query.filter.column.productName.price.table.productType.categoryId

如果对象有多个属性,字符串会是什么样子?当对象缺少
GM
属性值时,这个字符串如何表示您的对象?除了Bergi的注释外,它看起来是一个非常简单的任务。那么问题是什么呢?通常当人们谈论JavaScript对象的字符串表示时,他们谈论的是JSON。你是说你不想使用JSON吗?编辑:如果你不想要JSON,为什么不呢?这感觉您可能有一个XY问题(),您想要一个包含所有路径的数组,还是只需要一个特定的路径?如果它是一个特定的,您可以通过迭代查找匹配项,但请注意,类似的原语可能会触发错误命中。@Sam:好的,但是在不知道路径的情况下,您如何知道获取路径的属性?很好,但是如果对象有多个属性(如OP所示),该怎么办?@dandavis,拜托check@dandavis知道OP到底想要什么吗问题下的注释并不能帮助mei知道他试图做什么,包括属性更改事件中的父对象,但这不是做到这一点的方法。我怀疑他找到了比跟踪脆弱路径更简单、更容易的方法之一,现在他放弃了问题的任务……在OP数据上,我们得到了[“filter.column.productName”、“filter.column.price”、“filter.table.productType”、“filter.table.categoryId”]。这是正确的,很酷。不确定这是否有助于OP,但也不确定OP是否可以按照要求的方式得到帮助…@dandavis这不是OP想要的吗?@Fabrictor:这就是我想知道的。现在还不清楚像您的代码生成的“目录”如何帮助您从下一个原始值中识别出一个,但我认为根据我们掌握的信息,这是一个很好的答案。