Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按不同键中的特定值对数组中的对象排序_Javascript_Loops_Sorting_Filter - Fatal编程技术网

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

Javascript 按不同键中的特定值对数组中的对象排序,javascript,loops,sorting,filter,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 },

我有这个阵列-

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;
        }
  };
性能方法(存储产品地图并根据其id查找每个产品的配对)-O(n*2):

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

//如果一对不存在,请查找下一对
常数arr=[];
for(设i=0;iitem.pair===products[i].id);
if(containsPair===false){
const productPair=products.slice(i).find({id}=>id==item.pair));
arr.push(…[产品[i],产品对]);
}
}
控制台日志(arr)

当链接到一起的项目数介于
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"}

使用
数组#排序
是不可能的。你需要分组。顺便说一句,你尝试过什么?请展示你自己为解决这个问题所做的任何尝试,不管效率如何。@NinaScholz现在检查使用lodash像@4givN一样排序我需要一种方法来过滤两个键。没有一个我实际上尝试了你的两种方法,但它们都不起作用。这实际上是一种与我不同的情况,因为在我的例子中,只能有对,我的意思是两个项目之间只能有一个匹配,如果-arr[0]。productId===arr[1]。pairStock,这意味着arr[0[.pairStock==arr[1].productId此算法仍然有效,它会按升序对对对进行排序。输出将是
{id:111,pair:321},{id:321,pair:111},{id:123,pair:312},{id:312,pair:123}
我在4个产品上尝试了此算法,函数返回了8个产品。请共享输入数据。我的错了,只是不起作用-输入是-[{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'}]
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"}