【问题标题】:How sort array with objects by two diffrent keys?如何通过两个不同的键对带有对象的数组进行排序?
【发布时间】:2019-05-16 11:17:37
【问题描述】:

我不知道如何对比较两个键的对象数组进行排序。我有数组:

const arr = [
  {
    age: "20",
    group: "XXX",
    id: "3L1aa1558002753379",
    menu: "standard",
    name: "Adam"
  },
  {
    age: "22",
    group: "XXX",
    id: "xhNt11558002753379",
    menu: "standard",
    name: "Ola"
  },
  {
    otherid: "3L1aa1558002753379",
    age: "25",
    group: "YYY",
    id: "6ryVK1558002753379",
    menu: "standard",
    name: "Wommman"
  },
  {
    otherid: "xhNt11558002753379",
    age: "25",
    group: "YYY",
    id: "aL1aa1558002753312",
    menu: "standard",
    name: "xxxxxy"
  },
  {
    age: "25",
    group: "YYY",
    id: "6ryVK1558002753379",
    menu: "standard",
    name: "xxxxxo"
  }
  ,
  {
    otherid: "1ryVK1558002753372",
    age: "25",
    group: "YYY",
    id: "9ryVK155a002753370",
    menu: "standard",
    name: "xxxxxo"
  },
  {
    age: "25",
    group: "YYY",
    id: "1ryVK1558002753372",
    menu: "standard",
    name: "xxxxxo"
  }
];

我想以这种方式排序:如果“id”和“otherid”相同 - 让对象彼此相邻。不知道怎么弄,会有人这么厉害吗?

喜欢这里:

    const arr = [
  {
    age: "20",
    group: "XXX",
    id: "3L1aa1558002753379",
    menu: "standard",
    name: "Adam"
  },
  {
    otherid: "3L1aa1558002753379",
    age: "25",
    group: "YYY",
    id: "6ryVK1558002753379",
    menu: "standard",
    name: "Wommman"
  },
  {
    age: "22",
    group: "XXX",
    id: "xhNt11558002753379",
    menu: "standard",
    name: "Ola"
  },
  {
    otherid: "xhNt11558002753379",
    age: "25",
    group: "YYY",
    id: "aL1aa1558002753312",
    menu: "standard",
    name: "xxxxxy"
  },
  {
    age: "25",
    group: "YYY",
    id: "1ryVK1558002753372",
    menu: "standard",
    name: "xxxxxo"
  },
  {
    otherid: "1ryVK1558002753372",
    age: "25",
    group: "YYY",
    id: "9ryVK155a002753370",
    menu: "standard",
    name: "xxxxxo"
  },
    {
    age: "25",
    group: "YYY",
    id: "6ryVK1558002753379",
    menu: "standard",
    name: "xxxxxo"
  }
  ,
];

我尝试了类似的方法:Javascript sort array by two fields 但失败了

【问题讨论】:

  • 您必须创建用户定义的排序方法。
  • 什么意思?
  • Array.prototype.sort 接受一个函数作为第二个参数,让您提供自定义排序算法
  • 我知道。我有一个问题,因为我不知道如何使这样的功能像我描述的那样工作。
  • 那么你会怎么做呢?好的,现在添加一个检查以查看键是否相等,然后执行另一个键。

标签: javascript arrays sorting object


【解决方案1】:

您指出,您只需要计算对并在反应应用程序中呈现它们。

以视图可以直接呈现数据的方式构建数据会更有意义。

由于您可以控制数据,因此您无需生成平面列表。您可以使用层次结构或嵌套对象来设置(学生或其他)对。

let students = [{name: 'Jon', id:0}, {name: 'Peter', id: 1}, {name: 'Steve', id:2}, {name: 'Joe', id: 3}]
let pairs = [{a: students [3], b: students[1]}, {a: students [2], b: students [0]}];
console.log (pairs);

现在,如果您想渲染这些对,您已经拥有所需结构中的数据。

render () {
      return pairs.map (pair => <Pair data={pair} />)
}

如果您愿意,您还可以展平pairs数组并呈现一个彼此相邻的平面元素列表。

let students = [{name: 'Jon', id:0}, {name: 'Peter', id: 1}, {name: 'Steve', id:2}, {name: 'Joe', id: 3}]
let pairs = [{a: students [3], b: students[1]}, {a: students [0], b: students [2]}];
const flatten = (flat, {a, b}) => [...flat, a, b];
const sorted  = pairs.reduce (flatten, []);
console.log (sorted)
const Student = data => <div>{data.name}</div>
const Pair = pair => <div>
    <Student data={pair.a} />
    <Student data={pair.b} />
</div>
const renderFlat = () => {
     return sorted.map (student => <Student data={student} />
}
const renderPairs = () => {
     reutnr pairs.map (pair => <Pair data={pair} />)
}

我希望我至少有点意思。 - 无论如何,这是排序功能

function sort (arr)  {
   let otherids = arr.reduce ((lkp, obj) => {
       if (obj.otherid)
       lkp [obj.otherid] = obj;
       return lkp;
   }, {}); 

   let sorted = []; 

   for (var i=0; i < arr.length; i++) {
      let obj = arr [i];
      if (!!~sorted.indexOf (obj)) continue;
      
      if (otherids [obj.id]) {
          sorted.push (obj) 
          sorted.push(otherids[obj.id])
      }
   }

   return sorted.concat (arr.filter (obj => !~sorted.indexOf (obj)));
}

let sorted = sort (arr);
console.log (sorted);
<script>var arr=[{age:"20",group:"XXX",id:"3L1aa1558002753379",menu:"standard",name:"Adam"},{age:"22",group:"XXX",id:"xhNt11558002753379",menu:"standard",name:"Ola"},{otherid:"3L1aa1558002753379",age:"25",group:"YYY",id:"6ryVK1558002753379",menu:"standard",name:"Wommman"},{otherid:"xhNt11558002753379",age:"25",group:"YYY",id:"aL1aa1558002753312",menu:"standard",name:"xxxxxy"},{age:"25",group:"YYY",id:"6ryVK1558002753379",menu:"standard",name:"xxxxxo"},{otherid:"1ryVK1558002753372",age:"25",group:"YYY",id:"9ryVK155a002753370",
menu:"standard",name:"xxxxxo"},{age:"25",group:"YYY",id:"1ryVK1558002753372",menu:"standard",name:"xxxxxo"}];</script>

【讨论】:

  • 有效!你太棒了! Beer for you: D 我是 React 的初学者。我需要这个来做这样的夫妻,我不知道这是否是个好主意,但我想到的只有这个解决方案。
  • :) 很高兴我能帮上忙,如果你只想做对,我建议保留一个对数组 [[{a: {...}, b: {...}}, {a: {...}, b: {...}}] 然后你可以毫不费力地渲染这个数组 :)
  • 对不起,我不知道发生了什么事。 :( 是关于使用任何特定的属性或功能吗?
  • 这个排序我还是有问题。如果有两个以上相同的“otherid”值,那么它就不能正常工作。
【解决方案2】:

排序字符串的关键是使用String.localeCompare()。数字、日期和布尔值要简单得多。

这是一个按两个字符串列对对象列表进行排序的示例 - namemenu

arr.sort(function comparerFn(L, R){
    if(L.name !== R.name) 
        return (new String(L.name)).localeCompare(R.name)===1?1:-1
    if(L.menu !== R.menu) 
        return (new String(L.menu)).localeCompare(R.menu)===1?1:-1
    return 0
})

推理奇数 ===1?1:-1 语法:localeCompare() 返回 1 或 0,但 sort compareFn 需要 0:(保持原样排序),>0:(L 在 R 之前),

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多