首页 > 解决方案 > 按不同键中的特定值对对象数组进行排序

问题描述

我有这个数组 -

let array = [
  {
    "id": 123,
    "pair": 312
  }, 
  {
    "id": 321,
    "pair": 111
  }, 
  {
    "id": 312,
    "pair": 123
  },
  {
    "id": 111,
    "pair": 321
  }
];

我需要它像这样排序=

let array = [
  {
    "id": 123,
    "pair": 312
  }, 
  {
    "id": 312,
    "pair": 123
  },
  {
    "id": 321,
    "pair": 111
  }, 
  {
    "id": 111,
    "pair": 321
  }
];

这意味着我需要在对象中找到配对键的匹配值,并将其放在第一个元素之后(最终我需要成对排序 - 当然数组会更大并且混合)我找不到有效的方法来实现这一目标。

这就是我尝试过的 - 感觉非常低效

products 是我从服务器获得的数组。

let pairs = [];
    let prods = [...products];
    for(let product of prods){
      if(product.matched){
        continue;
      }
        let pairStock = product.pairStock;
        let companyId = product.company;
        let matched = prods.filter(prod => prod.productId === pairStock && String(prod.company) === String(companyId));
        if(matched.length > 0){
          pairs.push(product);
          pairs.push(matched[0]);
          let index = prods.findIndex(prod => prod.productId === matched[0].productId);
          prods[index].matched = true;
        }
  };

标签: javascriptloopssortingfilter

解决方案


当链接在一起的项目数介于0和之间时,这将对数据进行排序array.length

let products = [
  { productId: 'PK0154', pairStock: 'PK0112-02' },
  { productId: 'PK0112-02', pairStock: 'PK0154' },
  { productId: 'MGS-140', pairStock: 'MGS-136' },
  { productId: 'GM-0168', pairStock: 'GM-0169' },
  { productId: 'GM-0169', pairStock: 'GM-0168' },
  { productId: 'MGS-136', pairStock: 'MGS-140' },
]

function sort(data) {
  var mappedArray = {}
  data.forEach(obj => (mappedArray[obj.productId] = obj))
  data.sort((a, b) => a.productId.localeCompare( b.productId) )
  var addToRes = (res, id) => {
    if (id !== undefined && mappedArray[id] !== undefined) {
      var obj = mappedArray[id]
      mappedArray[id] = undefined
      res.push(obj)
      addToRes(res, obj.pairStock)
    }
  }
  var result = []
  data.forEach(item => addToRes(result, item.productId))
  return result
}

console.log(sort(products))

其结果

0: {productId: "GM-0168", pairStock: "GM-0169"}
1: {productId: "GM-0169", pairStock: "GM-0168"}
2: {productId: "MGS-136", pairStock: "MGS-140"}
3: {productId: "MGS-140", pairStock: "MGS-136"}
4: {productId: "PK0112-02", pairStock: "PK0154"}
5: {productId: "PK0154", pairStock: "PK0112-02"}

推荐阅读