当前位置: 代码迷 >> JavaScript >> 如何更改对象数组中的列位置
  详细解决方案

如何更改对象数组中的列位置

热度:77   发布时间:2023-06-13 11:33:42.0

我有一个对象数组,我想更改列顺序,并为此从每个对象中添加一个静态值:

 var homes = [
        {
            "h_id": "3",
            "city": "Dallas",
            "state": "TX",
            "zip": "75201",
            "price": "162500"

        }, {
            "h_id": "4",
            "city": "Bevery Hills",
            "state": "CA",
            "zip": "90210",
            "price": "319250"
        },...
    ];

对此:

 var homes = [
        {
            "h_id": "3",
            "price": "162500",
            "zip": "75201",
            "city": "Dallas",
            "state": "TX",
            "staticValue":  "1234"
        }, {
            "h_id": "4",
            "price": "319250",
            "zip": "90210",
            "city": "Bevery Hills",
            "state": "CA",
            "staticValue":  "1234"
        },...
    ];

我已经试过了:

let data = homes.map(function(x) {
                                  return {h_id:x.h_id,
                                         price : x.price,
                                         zip : x.zip,
                                         city : x.city,
                                         state : x.state,
                                         staticValue : "1234"}
                                   });

但列顺序仍然

h_id,city,state,zip,price,staticValue

代替:

h_id,price,zip,city,state,staticValue

我究竟做错了什么?

编辑

实际上,我正在使用此Reorder将对象作为DataTable发送到C#控制器。 当到达控制器时,可以按照我的要求订购。 所以显然我使用的map函数工作正常。

这是一个工作示例:

你不能这样做

对象是名称/值对的无序集合

如果您真的想遵守顺序,那就去数组而不是对象。

对象属性的顺序在ECMAScript中也是非标准的。

而且我不知道重新排序对象的原因是什么?您可以仅通过属性名称访问它们。 那么,您从重新订购中获得的好处是什么?

ES2015有一些方法基于定义属性顺序的特定规则,除了一种特殊情况,顺序是按时间顺序排列的。 对象中属性的顺序取决于所包含属性的类型及其值。 这样我们就可以保证订单

我们可以以map功能为例

var homes = [
        {
        "1abc": "162500",
            "h_id": "3",
            "city": "Dallas",
            "state": "TX",
            "zip": "75201"


        }, {
            "h_id": "4",
            "city": "Bevery Hills",
            "state": "CA",
            "zip": "90210",
            "1abc": "319250"
        }
    ];
let data = homes.map(function(x) {
                                  return {h_id:x.h_id,
                                         '1abc':x["1abc"],
                                         zip : x.zip,
                                         city : x.city,
                                         state : x.state,
                                         staticValue : "1234"}
                                   });
console.log(homes)

console.log(data)

输出将像

在输出中,顺序已更改。 基于ES2015 ,属性顺序基于特定规则,因此我们无法保证重新排序在所有情况下均能完美执行,在某些情况下(如果我们的输入与定义的规则匹配)可能会有效。

注意:根据您的评论,我相信您需要将此对象发送到控制器操作,然后从那里调用合并查询。 如果是这种情况,我认为Json对象顺序无关紧要。 您的c# model binder绑定controller object.可以将其与controller object.绑定controller object. 如果您的控制器编写正确,并且以正确的参数顺序调用了SP ,则无需担心。 如果您的控制器逻辑错误,那么我们将无法通过更改Json属性顺序来解决此问题。

您需要访问正确的属性并正确重新排序-ES6为此提供了有用的功能:

let data = vm.homes.map({ h_id, city, state, zip, price } => { h_id, price, zip, city, state, staticValue:"1234" });
  相关解决方案