【发布时间】:2016-01-15 12:35:30
【问题描述】:
我在一个大型应用程序中使用 angular-translate。有几个人提交代码+翻译,很多时候翻译对象不同步。
我正在构建一个 Grunt 插件来查看两个文件的结构并进行比较(只是键和整体结构,而不是值)。
主要目标是:
- 查看每个文件,检查整个对象的结构 (或文件,在这种情况下)与翻译的完全相同;
- 出错时,返回不匹配的键。
事实证明它比我预期的要复杂一些。所以我想我可以这样做:
-
对对象进行排序; - 检查值包含的数据类型(因为它们是翻译,它将只有字符串或嵌套对象)并将其存储在另一个对象中,使键等于原始键,值将是string 'String',或者一个对象,如果它是一个对象。该对象包含子元素;
- 递归地重复步骤 1-2,直到整个对象被映射和排序;
- 对所有文件执行相同操作
- 对所有内容进行字符串化和比较。
一个小例子是以下对象:
{
key1: 'cool',
key2: 'cooler',
keyWhatever: {
anotherObject: {
key1: 'better',
keyX: 'awesome'
},
aObject: 'actually, it\'s a string'
},
aKey: 'more awesomeness'
}
将映射到:
{
aKey: 'String',
key1: 'String',
key2: 'String',
keyWhatever: {
aObject: 'String',
anotherObject: {
key1: 'String',
keyX: 'String'
}
}
}
在此之后,我会将所有对象字符串化并进行严格比较。
我的问题是,有没有更好的方法来执行此操作?无论是在简单性还是性能方面,因为有很多翻译文件而且它们都相当大。
我试图寻找已经可以执行此操作的库,但找不到。
谢谢
编辑:感谢 Jared 指出对象无法排序。我很惭愧地说这样的话:D 另一种解决方案可能是迭代主翻译文件上的每个属性,如果它们是字符串,则将密钥与其他文件进行比较。如果它们是对象,请“输入”它们并执行相同操作。也许它比我的第一个猜测还要简单。应该怎么做?
【问题讨论】:
-
尽管许多实现保持 insertion 顺序,但根据规范,javascript 对象是 unordered 键/值对。您将不得不使用
Object.keys并使用数组,您不能“排序”对象。 -
谢谢贾里德。我更正了我的问题详情!
-
这是一个大问题,所以我不声称有解决方案,但有一件事您可能没有想到:您将如何处理这个问题?
root = {myself: root }(也许你会抛出一个错误,但你不能永远崩溃页面递归) -
@Katana314 请记住,JSON 不能表示循环结构。这对 OP 来说不是问题
-
@skeggse 不,它不能,但即使只是检测到它正在尝试处理一个事实,您也需要牢记这一点。否则,您的代码很可能会进入递归无限循环,让任何使用该函数的人感到困惑,而不是意识到他们给它提供了一个坏对象。
标签: javascript json