按不同键中的特定值对对象数组进行排序

时间:2020-06-15 18:24:44

标签: javascript loops sorting filter

我有这个数组-

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
  }
];

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

这是我尝试过的-感觉效率很低

产品是我从服务器获得的阵列。

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;
        }
  };

2 个答案:

答案 0 :(得分:1)

当链接到一起的项目数在0array.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"}

答案 1 :(得分:0)

高效的方式(存储产品地图并通过其ID查找每个产品对)-O(n * 2):

const productsObj = {};
products.forEach(product => productsObj[product.id] = product);

const [seenProducts, pairedProducts] = [{}, []];
products.forEach(product => {
  const productPair = productsObj[product.pair);
  if (!seenProducts[product.id]) pairedProducts.push(...[product, productPair])
  seenProducts[productPair.id] = true;
});

console.log(pairedProducts)

直观的方法O(n ^ 2):

// Find the next pair if a pair doesn't already exist
const arr = [];

for (let i = 0; i < products.length; i++) {
  const containsPair = arr.some(item => item.pair === products[i].id);
  if (containsPair === false) {
    const productPair = products.slice(i).find(({ id }) => id === item.pair));
    arr.push(...[products[i], productPair]);
  }
}

console.log(arr)
相关问题