【问题标题】:How can I make an array of objects follow a "striped" pattern based on a key value?如何使对象数组遵循基于键值的“条纹”模式?
【发布时间】:2021-06-15 23:33:59
【问题描述】:

我有一组代表一些资金数据的对象。每个对象都有一个键名“type”,即 c 或 e。我需要返回一个表格,确保行的顺序遵循以下模式:c row => e row => c row => e row... etc.

数据通过 ID 以 desc 顺序返回,如果有原始数据集,则可以删除它们

[{type: 'c', id: 1}, {type: 'e', id: 2}, {type: 'c', id: 3}, {type: 'e', id: 4}]

我们删除第一个 {type: 'e', id: 2} 我希望表格显示

[{type: 'c', id: 1}, {type: 'e', id: 4}, {type: 'c', id: 3}]

不是

[{type: 'c', id: 1}, {type: 'c', id: 3}, {type: 'e', id: 4}]

有没有办法在这里使用 javascript 的 sort() 或者我需要编写一个自定义的排序函数,如果是,那会是什么样子?

【问题讨论】:

  • 这不是您可以轻松排序的东西,因为没有很好的比较来定义您的模式。这取决于绝对定位。
  • 你的问题不清楚:{type: 'e', id: 2}{type: '3', id: 4}是什么关系。
  • type: '3' 是什么意思?为什么你回来后不回答我之前的问题?
  • @MisterJojo 这是一种类型。现已修复。
  • 第一个元素 e 应该被更改,因为第二个元素 eid 具有更高的值,如果该值更低,则保持不变?即使起始数组包含 5 个或更多元素(c、e、c、e、c),最终数组也只能包含 3 个元素(c、e、c)。前2(c)永远不能改变?即使以下(c)具有更高的ID?逻辑在哪里?

标签: javascript sorting


【解决方案1】:

我认为你不能在这里以任何方式使用排序。

我认为,为了确保它遵循您的模式,最简单的解决方案是将您的数组拆分为 2 个较小的数组,一个包含所有 type: 'c',另一个包含所有 type: 'e',然后每次将它们重新合并在一起您对其进行更改。

类似:

let originalArray = [{type: 'c', id: 1}, {type: 'e', id: 2}, {type: 'c', id: 3}, {type: 'e', id: 4}];
originalArray.splice(2, 1)
let arrayOfTypeE = originalArray.filter(item => item.type === 'e');
let arrayOfTypeC = originalArray.filter(item => item.type === 'c');
let finalArray = [];
for (i = 0; i< arrayOfTypeE.length + arrayOfTypeC.length; i++){
    if(i %2 === 0){
        finalArray[i] = arrayOfTypeE[Math.floor(i / 2)];
    } else {
        finalArray[i] = arrayOfTypeC[Math.floor(i / 2)];
    }
}

finalArray.forEach((e,i)=>console.log(i, '=>' ,JSON.stringify(e)))
.as-console-wrapper { max-height: 100% !important; top: 0; }

但您需要确保不会有一个数组比另一个数组短 2 个元素,否则就无法维持您的模式。并且整个拆分/重新合并可以做成一个函数

【讨论】:

  • {type: '3', id: 4} 原始元素在哪里传递?
  • @MisterJojo 我认为这是一个错字,因为 '3' 和 'e' 彼此非常接近,并且原始问题中的第二行和第三行代码有一个带有 id 的对象: 4 和一个类型:'e'
  • @JulienRipet 删除拼接并添加条件以确保 cop[Math.floor(i/2)]eop[Math.floor(1/2)] 不是未定义的似乎给了我想要的结果。如果您编辑答案以反映这些更改,我可以接受
  • 这个答案产生 [ e , c , e ] 而不是 PO 预期的 [ c, e, c ]...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
相关资源
最近更新 更多