按另一个对象列表排列对象列表,按 id 排序

时间:2021-07-22 16:36:12

标签: javascript

嗨,我正在尝试组织这些数据,我可以通过 userSettings.categories 数组的索引来排列这个产品列表,我还需要像 sortedProducts 属性一样按 id 对产品进行排序,这就是我一直在尝试的现在,提前感谢社区。

let products = [
        {id: 1, name: 'Brasilian', category: 'cofee'},
        {id: 2, name: 'Colombian', category: 'cofee'},
        {id: 3, name: 'Apple', category: 'fruit'},
        {id: 4, name: 'Strawberry', category: 'fruit'},
        {id: 5, name: 'Banana', category: 'fruit'},
        {id: 6, name: 'Pepper', category: 'spices'},
        {id: 7, name: 'Salt', category: 'spices'}
    ]
    
    let userSettings = {
        categories: [
            {name: 'fruit', sortedProducts: [4, 3, 5]},
            {name: 'spices', sortedProducts: [6, 7]},
            {name: 'cofee', sortedProducts: [2, 1]},
        ]
    }


    let arrangedProducts = userSettings.categories.map(c => products.filter(o => o.category == c.name));

    console.log(arrangedProducts);


    
    expectedOutput = [
       [
        {id: 4, name: 'Strawberry', category: 'fruit'},
        {id: 3, name: 'Apple', category: 'fruit'},
        {id: 5, name: 'Banana', category: 'fruit'}
       ],
       [
        {id: 6, name: 'Pepper', category: 'spices'},
        {id: 7, name: 'Salt', category: 'spices'}
       ],
       [
        {id: 2, name: 'Colombian', category: 'cofee'},
        {id: 1, name: 'Brasilian', category: 'cofee'}
       ]
    ];

    console.log(expectedOutput);

3 个答案:

答案 0 :(得分:3)

你可以试试

 let arrangedProducts = userSettings.categories.map(
  c => c.sortedProducts.map(
    id => products.find(product => product.id === id)
  )
);

或者如果你以后有很多项目并且希望它运行得更快,你可以使用哈希表

const hashProduct = products.reduce((a, b) => ({...a, [b.id]: b}), {});

console.log(
  userSettings.categories.map(
    c => c.sortedProducts.map(id => hashProduct[id])
  )
);

答案 1 :(得分:2)

试试:

let products=[{id:1,name:"Brasilian",category:"cofee"},{id:2,name:"Colombian",category:"cofee"},{id:3,name:"Apple",category:"fruit"},{id:4,name:"Strawberry",category:"fruit"},{id:5,name:"Banana",category:"fruit"},{id:6,name:"Pepper",category:"spices"},{id:7,name:"Salt",category:"spices"}]
let userSettings={categories:[{name:"fruit",sortedProducts:[4,3,5]},{name:"spices",sortedProducts:[6,7]},{name:"cofee",sortedProducts:[2,1]}]};

let result = []
userSettings.categories.forEach((e) => { let arr = []; e.sortedProducts.forEach(f => arr.push(products.filter(g => g.id == f))); result.push(arr) })
console.log(result);

答案 2 :(得分:1)

您可以通过 sortedProducts 数组中的 indexOf 进行排序

userSettings.categories
    .map(c => products
         .filter(o => o.category == c.name)
         .sort((a, b) => 
             c.sortedProducts.indexOf(a.id) - c.sortedProducts.indexOf(b.id)))

let products = [{
    id: 1,
    name: 'Brasilian',
    category: 'cofee'
  },
  {
    id: 2,
    name: 'Colombian',
    category: 'cofee'
  },
  {
    id: 3,
    name: 'Apple',
    category: 'fruit'
  },
  {
    id: 4,
    name: 'Strawberry',
    category: 'fruit'
  },
  {
    id: 5,
    name: 'Banana',
    category: 'fruit'
  },
  {
    id: 6,
    name: 'Pepper',
    category: 'spices'
  },
  {
    id: 7,
    name: 'Salt',
    category: 'spices'
  }
]

let userSettings = {
  categories: [{
      name: 'fruit',
      sortedProducts: [4, 3, 5]
    },
    {
      name: 'spices',
      sortedProducts: [6, 7]
    },
    {
      name: 'cofee',
      sortedProducts: [2, 1]
    },
  ]
}


let expectedOutput = userSettings.categories.map(c => products.filter(o => o.category == c.name).sort((a, b) => c.sortedProducts.indexOf(a.id) - c.sortedProducts.indexOf(b.id)));

console.log(expectedOutput);

相关问题