【问题标题】:Reorder array of objects based on array of strings?根据字符串数组重新排序对象数组?
【发布时间】:2020-06-03 18:53:16
【问题描述】:

我有以下数据结构:

const fieldOrder = [
  'title',
  'first_name',
  'last_name',
  'address_1',
  'address_2',
  'city',
  'state',
  'zipcode',
  'country',
]

const fields = [
  {
    name: 'first_name',
    value: 'John'
  },
  {
    name: 'title',
    value: 'Mr'
  }
  ...etc
]

我想根据name 键在fieldOrder 数组中的位置重新排序fields 对象数组。这怎么可能?也许以某种方式使用Array.sort 方法?

而且,一般来说,这是表示秩序的最佳方式吗?

【问题讨论】:

    标签: javascript arrays node.js data-structures ecmascript-6


    【解决方案1】:

    您可以从字段顺序数组创建对象,然后使用sort 方法根据该对象中的值进行排序,该对象将成为顺序数组中当前元素的索引。

    const fieldOrder = [
      'title',
      'first_name',
      'last_name',
      'address_1',
      'address_2',
      'city',
      'state',
      'zipcode',
      'country',
    ].reduce((r, e, i) => {
      r[e] = i;
      return r
    }, {})
    
    const fields = [{
        name: 'first_name',
        value: 'John'
      },
      {
        name: 'title',
        value: 'Mr'
      }
    ].sort((a, b) => fieldOrder[a.name] - fieldOrder[b.name])
    
    console.log(fields)

    【讨论】:

      【解决方案2】:

      fieldOrder 中查找name 的索引并使用.sort 来实现:

      const fieldOrder = [
        "title",
        "first_name",
        "last_name",
        "address_1",
        "address_2",
        "city",
        "state",
        "zipcode",
        "country"
      ];
      
      const fields = [
        {
          name: "first_name",
          value: "John"
        },
        {
          name: "title",
          value: "Mr"
        }
      ];
      
      const result = fields.sort((a,b) => {
        const aNdx = fieldOrder.findIndex(e => e === a.name);
        const bNdx = fieldOrder.findIndex(e => e === b.name);
      
        return aNdx - bNdx;
      })
      
      console.log(result);

      【讨论】:

        【解决方案3】:

        您可以根据数组中的索引对其进行排序;

        const fieldOrder = [
            'title',
            'first_name',
            'last_name',
            'address_1',
            'address_2',
            'city',
            'state',
            'zipcode',
            'country',
          ]
          
          const fields = [
            {
                name: 'first_name',
                value: 'John'
            },
            {
                name: 'title',
                value: 'Mr'
            },
            {
                name: 'city',
                value: 'JNB'
            },
            {
                name: 'country',
                value: 'RSA'
            }
        ]
        
        fields.sort( (a, b) => fieldOrder.indexOf(a.name) - fieldOrder.indexOf(b.name));
        
        console.log(fields)

        【讨论】:

          猜你喜欢
          • 2014-10-19
          • 1970-01-01
          • 2021-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多