获取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:这就是我想知道的。现在还不清楚像您的代码生成的“目录”如何帮助您从下一个原始值中识别出一个,但我认为根据我们掌握的信息,这是一个很好的答案。