将Javascript对象转换为数组(顺序很重要)

将Javascript对象转换为数组(顺序很重要),javascript,arrays,node.js,Javascript,Arrays,Node.js,关于将Javascript对象转换为数组,有太多的问题要问 但我找不到任何将Javascript对象转换为具有保证顺序的数组的示例 我想用一个例子来解释你: 如果我有一个名为person-like的对象: var person = { f_name: "John", l_name: "Doe", age: 20 } 我想要一个数组,它将始终看起来像: ["John", "Doe", 20] 我的意思是数组中的值应始终与对象的顺序相同 回复@KevinB: 假设属性始终

关于将Javascript对象转换为数组,有太多的问题要问

但我找不到任何将Javascript对象转换为具有保证顺序的数组的示例

我想用一个例子来解释你:

如果我有一个名为person-like的对象:

var person = {
    f_name: "John",
    l_name: "Doe",
    age: 20
}
我想要一个数组,它将始终看起来像:

["John", "Doe", 20]
我的意思是数组中的值应始终与对象的顺序相同

回复@KevinB:


假设属性始终可枚举,您可以使用:

var-person={
f_名称:“约翰”,
l_名称:“Doe”,
年龄:20
}
var VAL=对象值(人);

控制台日志(VAL)javascript对象没有顺序,您必须用以下方式定义它

var-person={
f_名称:“约翰”,
l_名称:“Doe”,
年龄:20
}
变量定义顺序=['f_name','l_name','age'];
让结果=[];
for(按定义的顺序排列){
结果.推(人[道具]);
}

控制台日志(结果)如果要保证顺序,则需要在保证顺序的数据结构(如列表)中定义该顺序

例如,您可以这样做:

let person = {
    f_name: "John",
    l_name: "Doe",
    age: 20
}
let orderedKeys = ["f_name", "l_name", "age"];
let personArray = orderedKeys.map(function (key) {
    return person[key];
});
这里我刚刚举了一个例子。但我的实际问题是:我使用node DBF library从DBF文件获取值,它将每一行作为对象而不是数组返回给我。这些键包含一些unicode字符。所以,我想要的数组的顺序与DBF列的顺序相同

因此,它实际上不是关于对象中键的感知顺序,而是文件中列的顺序。这改变了一切

偷看一下,这应该可以做到:


javascript对象没有order@marvel308我知道。但我指的是我指定Javascript对象键的顺序。听起来很简单。你甚至不需要循环,但是你没有指定对象键的顺序,你只是指定键的存在。一旦您声明了一个对象文字,键顺序的所有承诺都将丢失。@Vishal,但您已经声明了顺序应该是什么。因此,按照所述顺序使用所述密钥创建数组<代码>[o.foo,o.bar,o.baz]
spec,否,但有文件证明,在某些情况下,对象键确实具有预期的顺序@bhspencer检查:注意JS保留了我的对象文本的定义顺序。@BenM:大多数浏览器似乎实现的顺序(这是在
OrdinalOwnPropertyKeys
中定义的(请参阅我之前发布的链接))是:整数键升序,字符串键按插入顺序,插入顺序中的符号。规范中更重要的部分是:,在调用
Object.values
时调用,其中说明:“未指定枚举属性的机制和顺序,但必须符合下面指定的规则。”即使顺序似乎已定义,但未定义。这是有道理的,因为这是一个向后不兼容的更改。@bhspencer但是在ES2015和以后的版本中,非整数键将按插入顺序返回。这基本上是@BenM所展示的,但他得到了反对票。关键点按它们在对象中存在的顺序放置。基本上就这么简单,但不一样。他信任Object.values的实现,但我正在编写自己的实现,因为我不确定不同版本的JS如何实现该方法。正如您在该答案的注释中所看到的,较旧和较新的JS版本有不同的实现方式。我不会怀疑它在大多数情况下是好的;然而,在这种情况下,我更愿意相信我自己的实现,它100%都在所有JS版本上运行。如果他提到一个警告,即可能实现该方法的不同版本可能有所不同,那么反对票可能会减少。
var columns;
parser.on('header', function(header) {
    columns = header.fields.map(field => field.name);
    console.log("columns", columns);
});

parser.on('record', function(record) {
    var row = columns.map(key => record[key]);
    console.log("row", row);
});
parser.on('record', function(record) {
    var row = this.header.fields.map(field => record[field.name]);
    console.log("row", row);
});