【问题标题】:ES6 - Reorder an Array with respect to an ObjectES6 - 相对于对象重新排序数组
【发布时间】:2020-05-15 04:50:46
【问题描述】:

我有一个类似的数组:

const my_array = [
"S T"
"O P"
"Lend"
"GT"
"CT"
"AC"
];

和一个对象,这个数组被重新排序:

const AN_ORDER = {
  'Lend': 1,
  'C T': 2,
  'S T': 3,
  'AC': 4,
  'O P': 5
};

已经有一个解决方案 //来自 Lodash 的键和 sortBy

const new_array = keys(my_array);
return sortBy(new_array, ar => AN_ORDER[ar] || Number.MAX_SAFE_INTEGER);

这会产生我的新数组:

["Lend", "AC", "O P", "S T", "GT", "C T"]

我尝试查看此用法的文档,但我不明白 sortBy 中使用第二个参数的想法。

现在我需要按以下顺序重新排序 my_array

['Lend', 'C T', 'S T', 'GT', 'AC', 'O P']

请帮助我理解实现并提出一种我可以按照相同逻辑重新排序的方法。

【问题讨论】:

  • 顶部有“CT”,底部有“CT”。你也有“keys()”,它不会给你显示的输出。这是您使用的实际代码吗?输出看起来像预期的那样,并且您要求的输出不一致
  • AN_ORDER 是数组还是对象?
  • 看起来你有一个问题需要解决,但你误解了他们的要求。您只应该将他们要求您排序的那些排序到数组中,其他所有内容都应该保持在他们之前的位置。 lodash 无法为您做到这一点。您还应该在比较中忽略空格,并使用 AN 对象中的值。

标签: javascript sorting ecmascript-6 lodash


【解决方案1】:

您的键“G T”不在对象“AN_ORDER”中,因此我的输出看起来与您的不同。但它工作正常。

const myArray = [
        'S T',
        'O P',
        'Lend',
        'GT',
        'C T',
        'AC'
        ];


const AN_ORDER = {
        'Lend': 1,
        'C T': 2,
        'S T': 3,
        'AC': 4,
        'O P': 5
        };

const sortedCollection = _.sortBy(myArray, item => {
        return AN_ORDER[item];
      });

【讨论】:

    【解决方案2】:

    您在第二个参数中添加了数组,这里您可以提及回调函数或属性名称。

    这是可行的解决方案

    const my_array = [
    "S T",
    "O P",
    "Lend",
    "GT",
    "C T",
    "AC"
    ];
    
    var AN_ORDER = {
      "Lend": 1,
      "C T": 2,
      "S T": 3,
      "AC": 4,
      "O P": 5
    };
    
    console.log(_.sortBy(my_array, [a => {
    return (AN_ORDER[a] || Number.MAX_SAFE_INTEGER);
    }]));
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

    【讨论】:

      【解决方案3】:

      不确定 AN_ORDER 代表什么,因为没有足够的信息说明它究竟代表什么。
      在最终数组中使用 AN_ORDER 中的键,因为上面指定的输出使用了它。在搜索匹配键之前去除空格,使用 Set 搜索是否存在,并使用 0.5 的偏移量将不存在的键插入 AN_ORDER 进行排序。

      const my_array = [
      "S T",
      "O P",
      "Lend",
      "GT",
      "CT",
      "AC"
      ];
      
      const AN_ORDER = {
        'Lend': 1,
        'C T': 2,
        'S T': 3,
        'AC': 4,
        'O P': 5
      };
      
      const keys = new Set(Object.keys(AN_ORDER).map(x=>x.replace(/\s/g,'')))
      
      my_array.forEach( (x,i)=>!keys.has(x.replace(/\s/g,'')) && (AN_ORDER[x]=i+0.5) )
      
      my_obj = _.sortBy(Object.entries(AN_ORDER), ([,x])=>x).map(([x,])=>x)
      
      console.log(my_obj);
      <script src="https://cdn.jsdelivr.net/npm/lodash/lodash.min.js"></script>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 2018-08-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多