如果我有兩個物件,并且它們內部都有兩個陣列欄位,如下所示:
const list1 = {
name: 'list-1',
fruits: ['banana', 'strawberry', 'cherry'],
vegs: ['lettuce', 'avocado', 'beans']
};
const list2 = {
name: 'list-2',
fruits: ['banana', 'apple', 'orange', 'watermelon'],
vegs: ['potato', 'avocado', 'onion', 'cabbage']
};
然后,我傳入兩個陣列,一個是水果,一個是蔬菜,例如:
const fruits = ['banana', 'strawberry'];
const vegetables = ['potato', 'lettuce', 'avocado'];
我如何訂購這些物件,以便讓水果和蔬菜數量最多的物件(基于傳入的陣列)位于頂部?
在這種情況下就是這樣list1,因為它在水果中既有“香蕉”和“草莓”,在蔬菜中也有“生菜”和“鱷梨”(即總共 4 個匹配項),而總共list2只有 2 個匹配項。
不確定這是否有意義,但是根據陣列對兩個物件進行排序的最有效方法是什么?
uj5u.com熱心網友回復:
首先,您需要定義一個intersection函式——一個函式,給定兩個串列,回傳一個僅包含兩個串列中的元素的新串列。如果您想撰寫自己的版本,或者您可以使用大量庫來完成此操作(例如Ramda或Lodash) ,這里有一個非常全面的答案。您可以在排序函式中執行此操作,但不難想象在其他背景關系中您會再次需要它,因此擁有可重用函式可能是有意義的。
假設你有一個可用的這個函式的實作,你現在可以撰寫一個自定義的比較函式,它可以用來根據你提供的規則對形狀像list1這樣的物件進行排序,如下所示:list2
const compareByTotal = (a, b) => {
const aTotal = intersection(a.fruits, fruits).length intersection(a.vegs, vegetables).length;
const bTotal = intersection(b.fruits, fruits).length intersection(b.vegs, vegetables).length;
return bTotal - aTotal;
}
最后,您可以在呼叫時將此函式用作引數sort以生成這些物件的排序串列:
[list1, list2].sort(compareByTotal);
uj5u.com熱心網友回復:
如果我正確理解您的問題,首先您需要將物件放入自己的陣列中,然后您可以使用 Array.Prototype.sort: https ://developer.mozilla.org/en-US/docs/Web/JavaScript /參考/Global_Objects/陣列/排序
例如。
const list1 = {
name: 'list-1',
fruits: ['banana', 'strawberry', 'cherry'],
vegs: ['lettuce', 'avocado', 'beans']
};
const list2 = {
name: 'list-2',
fruits: ['banana', 'apple', 'orange', 'watermelon'],
vegs: ['potato', 'avocado', 'onion', 'cabbage']
};
const arrayOfLists = [list1, list2]
arrayOfLists.sort((a, b) => (a.fruits.length a.vegs.length) < (b.fruits.length b.vegs.length) )
console.log(arrayOfLists) // Output = [list2, list1] because list 2 has more fruits and vegetables
uj5u.com熱心網友回復:
我認為通過回圈遍歷它們并給每個分數打分然后選擇一個獲勝者是相當容易的
const list1 = {
name: 'list-1',
fruits: ['banana', 'strawberry', 'cherry'],
vegs: ['lettuce', 'avocado', 'beans']
};
const list2 = {
name: 'list-2',
fruits: ['banana', 'apple', 'orange', 'watermelon'],
vegs: ['potato', 'avocado', 'onion', 'cabbage']
};
const fruits = ['banana', 'strawberry'];
const vegetables = ['potato', 'lettuce', 'avocado'];
const selectAWinner = (fruits,vegetables)=>{
let list1Score = 0;
let list2Score = 0;
fruits.forEach(fruit=>{
list1.fruits.forEach(fruitFromTheList=>{
if (fruitFromTheList === fruit)
list1Score
})
})
vegetables.forEach(vegetable=>{
list1.vegs.forEach(vegetableFromTheList=>{
if (vegetableFromTheList === vegetable)
list1Score
})
})
fruits.forEach(fruit=>{
list2.fruits.forEach(fruitFromTheList=>{
if (fruitFromTheList === fruit)
list2Score
})
})
vegetables.forEach(vegetable=>{
list2.vegs.forEach(vegetableFromTheList=>{
if (vegetableFromTheList === vegetable)
list2Score
})
})
if (list1Score > list2Score)
document.write("list 1 wins with score " list1Score)
else if (list1Score < list2Score)
document.write("list 2 wins with score " list2Score)
else document.write("it's a tie")
// or do something else with the results
}
selectAWinner(fruits,vegetables)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/494708.html
標籤:javascript 数组 排序 目的
上一篇:無法列印物件的值
下一篇:從物件陣列中洗掉多個物件
