【问题标题】:How to Change Columns position in an Object array如何更改对象数组中的列位置
【发布时间】:2019-07-07 05:45:02
【问题描述】:

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

 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# 控制器。当到达控制器时,它是我想要的。所以显然我使用的地图功能很好。

这是一个工作示例: jsfiddle.net/a6o8jbh9/1

【问题讨论】:

    标签: javascript arrays angularjs object ecmascript-6


    【解决方案1】:

    你不能这样做

    object 是一组无序的名称/值对

    如果你真的想坚持顺序,那么选择数组而不是对象。

    对象属性的顺序在 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. 绑定如果你的控制器编写正确并且如果它以正确的参数顺序调用SP,那么不用担心。如果您的控制器逻辑错误,那么我们无法通过更改 Json 属性顺序来解决此问题。

    【讨论】:

    • 原因是将此对象作为表发送到我无法编辑的 C# 控制器。控制器将表发送到 SQL Server 中的合并存储过程,该过程需要列的确切顺序。
    • 感谢您的回答和信息,但就我而言,地图功能有效
    • @DorLugasi 你能为我的工作示例提供一个 jsfiddle 吗
    • 结果不显示在 Javascript 中,它显示在 c# 控制器中。使用 map 函数更改顺序时,DataTable 中的顺序也会发生变化
    • @DorLugasi 但是您编写的代码/或接受的答案在 js 中,对吗?我同样要求一个 jsfiddle。
    【解决方案2】:

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

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

    【讨论】:

    • 你能给我一个小提琴吗
    • @DorLugasi 这是这样做的方法,由于 ArunprasanthKV 的答案中概述的想法,它有时可能不起作用。您可能需要 JSON 方法。
    • 请为您的示例提供一个 jsfiddle。因为当我尝试它时,它不起作用
    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 2016-01-09
    • 2019-02-14
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    相关资源
    最近更新 更多