javascript - 对另一个数组中的对象键数组进行排序

标签 javascript arrays

如何根据键合并对象数组

let data = [
  {
    "fields": [
      {
        "key": "terminal",
        "value": null
      },
      {
        "key": "status",
        "value": "Enabled"
      },
      {
        "key": "area",
        "value": null
      },
      {
        "key": "note",
        "value": "Some key notes"
      },
      {
        "key": "group",
        "value": "Medium"
      },
      {
        "key": "level",
        "value": null
      }
    ],
    "name": "test 1",
    "number": "123456127890",
    "id": "yqweyqweu213"
  },
  {
    "fields": [
      {
        "key": "terminal",
        "value": null
      },
      {
        "key": "status",
        "value": "Disabled"
      },
      {
        "key": "area",
        "value": "Delhi"
      },
      {
        "key": "note",
        "value": "Some key orginal notes"
      },
      {
        "key": "group",
        "value": "Medium"
      },
      {
        "key": "level",
        "value": "High"
      }
    ],
    "name": "test 2",
    "number": "173276123612",
    "id": "uqweyewueyyuqwe"
  },
  {
    "fields": [
      {
        "key": "terminal",
        "value": 1
      },
      {
        "key": "status",
        "value": "Enabled"
      },
      {
        "key": "area",
        "value": "Mumbai"
      },
      {
        "key": "note",
        "value": "Some key orginal sample notes"
      },
      {
        "key": "group",
        "value": "Low"
      },
      {
        "key": "level",
        "value": null
      }
    ],
    "name": "test 3",
    "number": "128737812381723",
    "id": "kasjdashdkaskjd"
  }
]

const orderArr = [
  "area",
  "terminal",
  "note",
  "status",
  "group",
  "level"
]

尝试使用以下代码片段

 data.forEach(o => {
  let keys = []
  o.fields.forEach(f => {
    keys.push(f.key)
  })
  let sortedKeys =  keys.sort(function(a, b) {
    return orderOfFields.indexOf(a) - orderOfFields.indexOf(b);
   })
   let obj = {}
   sortedKeys.forEach(s => {
     obj[s] = // how to get the value
   })
   return obj
 })

预期结果是

  let expectedData = [
    {
      "fields": [
        {
          "key": "area",
          "value": null
        },
        {
          "key": "terminal",
          "value": null
        },
        {
          "key": "note",
          "value": "Some key notes"
        },
        {
          "key": "status",
          "value": "Enabled"
        },
        {
          "key": "group",
          "value": "Medium"
        },
        {
          "key": "level",
          "value": null
        }
      ],
      "name": "test 1",
      "number": "123456127890",
      "id": "yqweyqweu213"
    },
    {
      "fields": [
        {
          "key": "area",
          "value": "Delhi"
        },
        {
          "key": "terminal",
          "value": null
        },

        {
          "key": "note",
          "value": "Some key orginal notes"
        },
        {
          "key": "status",
          "value": "Disabled"
        },

        {
          "key": "group",
          "value": "Medium"
        },
        {
          "key": "level",
          "value": "High"
        }
      ],
      "name": "test 2",
      "number": "173276123612",
      "id": "uqweyewueyyuqwe"
    },
    {
      "fields": [
        {
          "key": "area",
          "value": "Mumbai"
        },
        {
          "key": "terminal",
          "value": 1
        },
        {
          "key": "note",
          "value": "Some key orginal sample notes"
        },
        {
          "key": "status",
          "value": "Enabled"
        },

        {
          "key": "group",
          "value": "Low"
        },
        {
          "key": "level",
          "value": null
        }
      ],
      "name": "test 3",
      "number": "128737812381723",
      "id": "kasjdashdkaskjd"
    }
  ]

最佳答案

您不必获取sortedKeys,然后创建一个对象。您可以直接在 sort 的 compareFunction 中使用 indexOf。如果 a.keyorderArrcomapred b.key 中具有较低的索引,则减法将返回 -1 和 a 将被放置在 b 之前。

const data=[{"fields":[{"key":"terminal","value":null},{"key":"status","value":"Enabled"},{"key":"area","value":null},{"key":"note","value":"Some key notes"},{"key":"group","value":"Medium"},{"key":"level","value":null}],"name":"test 1","number":"123456127890","id":"yqweyqweu213"},{"fields":[{"key":"terminal","value":null},{"key":"status","value":"Disabled"},{"key":"area","value":"Delhi"},{"key":"note","value":"Some key orginal notes"},{"key":"group","value":"Medium"},{"key":"level","value":"High"}],"name":"test 2","number":"173276123612","id":"uqweyewueyyuqwe"},{"fields":[{"key":"terminal","value":1},{"key":"status","value":"Enabled"},{"key":"area","value":"Mumbai"},{"key":"note","value":"Some key orginal sample notes"},{"key":"group","value":"Low"},{"key":"level","value":null}],"name":"test 3","number":"128737812381723","id":"kasjdashdkaskjd"}]
const orderArr=["area","terminal","note","status","group","level"]

data.forEach(o => 
  o.fields.sort((a, b) => orderArr.indexOf(a.key) - orderArr.indexOf(b.key))
)

console.log(data)

如果您想要一个新数组而不改变原始数组,您可以使用 map ,如下所示:

const data=[{"fields":[{"key":"terminal","value":null},{"key":"status","value":"Enabled"},{"key":"area","value":null},{"key":"note","value":"Some key notes"},{"key":"group","value":"Medium"},{"key":"level","value":null}],"name":"test 1","number":"123456127890","id":"yqweyqweu213"},{"fields":[{"key":"terminal","value":null},{"key":"status","value":"Disabled"},{"key":"area","value":"Delhi"},{"key":"note","value":"Some key orginal notes"},{"key":"group","value":"Medium"},{"key":"level","value":"High"}],"name":"test 2","number":"173276123612","id":"uqweyewueyyuqwe"},{"fields":[{"key":"terminal","value":1},{"key":"status","value":"Enabled"},{"key":"area","value":"Mumbai"},{"key":"note","value":"Some key orginal sample notes"},{"key":"group","value":"Low"},{"key":"level","value":null}],"name":"test 3","number":"128737812381723","id":"kasjdashdkaskjd"}]
const orderArr=["area","terminal","note","status","group","level"]

const output = data.map(o => ({ 
  ...o, 
  fields: [...o.fields].sort((a, b) => orderArr.indexOf(a.key) - orderArr.indexOf(b.key)) 
}))

console.log(output)

关于javascript - 对另一个数组中的对象键数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56342159/

相关文章:

javascript - 使用 jQuery 将字符串中的第一个字母(带有字母和数字)大写

python - 如何确定列表和数组混合的维度?

c# - .NET 核心 : Array class does not contain definition for ConvertAll

python - 如何将两个列表合并到一个数组中,这样我就不必对其进行硬编码

javascript - 如何将用户属性添加到 Javascript Azure Function 的服务总线主题输出

javascript - 在 d3 中按 Angular 绘制日期和频率的折线图

javascript - jQuery.css ('display' ) 只返回内联

javascript - 无法将 PHP 变量传递给 javascript 函数

java - 使用java中的scanner类将值插入到两个数组中

java - 如何在冒泡排序中对随机数进行排序