Javascript 处理非理想JSON的最佳方法?

Javascript 处理非理想JSON的最佳方法?,javascript,json,Javascript,Json,我当前正在尝试读取一个.vdf文件,该文件为。我发现了一个简单的方法,它似乎很适合我的需要,但是JSON输出的格式不太理想。例如,对于以下VDF输入: "LibraryFolders" { "TimeNextStatsReport" "1523464730" "ContentStatsID" "8627456721266182211" "1" "G:\\Steam" } 我得到以下JSON输出: { "LibraryFolder

我当前正在尝试读取一个
.vdf
文件,该文件为。我发现了一个简单的方法,它似乎很适合我的需要,但是JSON输出的格式不太理想。例如,对于以下VDF输入:

"LibraryFolders"
{
    "TimeNextStatsReport"       "1523464730"
    "ContentStatsID"        "8627456721266182211"
    "1"     "G:\\Steam"
}
我得到以下JSON输出:

{
    "LibraryFolders": {
        "1": "G:\\\\Steam",
        "TimeNextStatsReport": "1523464730",
        "ContentStatsID": "8627456721266182211"
    }
}
我需要一种方法来获取
LibraryFolders
对象中的所有变量,并使用严格的数字名称(1、2、3…)将它们放入一个数组中,去掉
TimeNextStatsReport
ContentStatsID
字段。你会怎么做

我认为最容易处理的输出如下:

{
    "LibraryFolders": [
        "G:\\\\Steam",
        ...
    ]
}

省略号显然表示任何数字命名字段的延续。

解析JSON后,我们可以使用以下组合:
对象.entries
数组.filter
&
数组.map
,以实现所需的格式

let对象={
“图书馆文件夹”:{
“1”:“G:\\\\Steam”,
“TimeNextStatsReport”:“1523464730”,
“ContentStatsID”:“8627456721266182211”,
“2”:“其他数字键”,
}
}
object.LibraryFolders=object.entries(object.LibraryFolders)
.filter(([key,value])=>Number(key))//筛选非数字键
.map(([,value])=>value);//我们只保留价值,不保留钥匙

console.log(对象)这里有一个示例代码,可以实现您想要的功能(我想)

//让我们以对象为例。
让LibraryFolders={
“1”:“G:\\\\Steam”,
“TimeNextStatsReport”:“1523464730”,
“ContentStatsID”:“8627456721266182211”,
“2”:“kasjfkljaklsjf”,
“1241212213”:“alskdjlkasjkladsjasj”,
“123JK123123”:“aksjdljasdkljklsad”,
};
//我们定义了一个函数,它将发挥神奇的作用
函数getArrayVersion(obj){
返回Object.keys(obj.filter)(key=>{
如果(!isNaN(键)){
返回键
//返回parseInt(key);//以防需要INT转换。
}
});
}
//我们称之为魔法

console.log(getArrayVersion(LibraryFolders))
我将为您提供另一个循环示例:

let对象={
“图书馆文件夹”:{
“1”:“G:\\\\Steam”,
“TimeNextStatsReport”:“1523464730”,
“ContentStatsID”:“8627456721266182211”,
“2”:“kasjfkljaklsjf”,
“1241212213”:“alskdjlkasjkladsjasj”,
“123JK123123”:“aksjdljasdkljklsad”,
}
};
object['LibraryFolders']=object.key(object['LibraryFolders'])。reduce((acc,current)=>(/^\d+$/.test(current)和&acc.push(object['LibraryFolders'][current]),acc),[]);

console.log(对象)
所以您需要:
{“LibraryFolders”:[“G:\\\Steam”,“1523464730”,“8627456721266182211”]}
@MarcosCasagrande Yes,但只有数字命名的字段(
“1”
)。我实际上不需要
TimeNextStatsReport
ContentStatsID
字段,只需要那些包含实际文件夹路径的字段。显示您想要的确切输出,我会告诉您如何执行。@MarcosCasagrande查看我的编辑。@user2864740注释:)非常感谢!我开始怀疑我的理智,这对我有多大的困扰。@Isaacorbrey稍微短一点alternative
object.LibraryFolders=object.assign([],object.LibraryFolders)。slice(1)
@Slai我必须说,我印象深刻,从来没有想到过那个。@MarcosCasagrande@Slai非常感谢你们两位!现在我只想弄清楚为什么
Object.entries()
Object.assign()
都不能使用TypeScript。@Isaacorbrey看看这里:他想要的是值,不是键:)@MarcosCasagrande谢谢你告诉我,很好。在这种情况下,他只需要将return改为:return obj[key]仍然不起作用,filter不改变值,它将保持不变。当然,你可以运行它并检查是否需要它。在
编辑的
中,我们可以看到你所有的更改,因此,你的第一个版本根本没有经过测试,所以你应该说:“我的坏,修复了!”而不是“当然”…我更新了第一个版本,然后看到了你的第一个组件和Answare。不管怎样,你很有趣