对一个阵列进行排序并使其他两个阵列保持同步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对一个阵列进行排序并使其他两个阵列保持同步相关的知识,希望对你有一定的参考价值。

data = {
    "age": [41, 21, 88],
    "name": ["Rob", "Tom", "Susan"],
    "color": ["Red", "Blue", "Orange"]
}

我如何根据1个数组的值对这些记录进行排序?我已经尝试了sort()函数,但它没有将数据压缩在一起。

data = {
    "age": [21, 41, 88],
    "name": ["Tom", "Rob", "Susan"],
    "color": ["Blue", "Red", "Orange"]
}
答案

您应该以真正面向对象的方式存储此类信息,如下所示:

[
  {
    "age": 41,
    "name": "Rob",
    "color": "Red"
  },
  {
    "age": 21,
    "name": "Tom",
    "color": "Blue"
  },
  {
    "age": 88,
    "name": "Susan",
    "color": "Orange"
  }
]

这可能看起来非常冗长,但它更优越:属于一起的属性现在真正绑定在一起。

然后按如下方式进行排序:

data.sort((a, b) => a.age - b.age)
另一答案

如果要将数组分开,可以通过对年龄数组进行排序来提取索引顺序,然后按顺序对每个数组进行排序:

let data = {
  "age": [41, 21, 88],
  "name": ["Rob", "Tom", "Susan"],
  "color": ["Red", "Blue", "Orange"]
};

let indexOrder = data.age
  .map((a, i) => [a, i])
  .sort((a, b) => a[0] - b[0])
  .map(a => a[1]);

for (let k in data) {
  data[k] = indexOrder.map(i => data[k][i]);
}

console.log(data);
另一答案

您始终可以重新构建数据并对其进行排序:

var data = {
  "age": [41, 21, 88],
  "name": ["Rob", "Tom", "Susan"],
  "color": ["Red", "Blue", "Orange"]
};
data.age.map(function(x, i) {
  return {
    age: data.age[i],
    name: data.name[i],
    color: data.color[i]
  };
}).sort(function(a, b) {
  // you can even sort by age then name then color
  return a.age - b.age;
}).forEach(function(o, i) {
  data.age[i] = o.age;
  data.name[i] = o.name;
  data.color[i] = o.color;
});
console.log(data);
另一答案

data = {
    "age": [41, 21, 88],
    "name": ["Rob", "Tom", "Susan"],
    "color": ["Red", "Blue", "Orange"]
}
var sortData = d => {
     var dat = []
     d.age.forEach(
     (di, i) => {
        dat.push(
            {
                age:di, 
                name:d.name[i],
                color:d.color[i]
            }
         )
     })
     dat.sort((a, b) => a.age - b.age)
     console.log(d)
     d = {
          age:[],
          name:[],
          color:[]
     }
     dat.forEach(di => {
          d.age.push(di.age)
          d.name.push(di.name)
          d.color.push(di.color)
     })
     console.log(d)
}
sortData(data)
另一答案

由于您的对象具有在一个对象中应该完全分开的值,如下所示:

{
  "age": 41,
  "name": "Rob",
  "color": "Red"
}

如果应用函数Array.prototype.map创建上面的对象,可以通过ageArray.prototype.sort)对其进行排序,然后使用函数Array.prototype.reduce重新创建所需的输出。

我建议您重新定义相关数据的存储方式。

let data = {    "age": [41, 21, 88],    "name": ["Rob", "Tom", "Susan"],    "color": ["Red", "Blue", "Orange"]},
    obj = data.age.map((age, i) => ({age, name: data.name[i], color: data.color[i]})),
    result = obj.sort(({age: a}, {age: b}) => a - b).reduce((a, c) => {
      a.age.push(c.age);
      a.color.push(c.color);
      a.name.push(c.name);
      return a;
    }, {age: [], color: [], name: []});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

以上是关于对一个阵列进行排序并使其他两个阵列保持同步的主要内容,如果未能解决你的问题,请参考以下文章

获得阵列之间的综合差异 - 在这种情况下需要同步阵列

北亚数据恢复raid5磁盘阵列在进行热备盘同步数据过程中,硬盘掉线导致raid崩溃的数据恢复案例

VueJs - 将创建的项目推送到现有阵列并使其与其他现有项目一起显示

2D阵列选择排序

调用排序映射后阵列上

服务器数据恢复案例 / raid5阵列多块硬盘离线处理方法