我有一個結構像這樣的物件陣列
const tools = [
{name:"React", image:"react.svg"},
{name:"Firebase", image:"firebase.svg"},
{name:"CSS", image:"css.svg"},
]
然后我有一個字串陣列。
const arr = ["React", "Firebase"]
如何檢查“工具”陣列是否包含“arr”陣列中的所有過濾器?
我想我應該使用 array.every() 或 array.some() 運算子,但我不確定在這種情況下如何實作其中任何一個。
我從一個重復的問題中找到了這個函式,但它并不完全適合我的用例,因為第一個陣列是一個物件陣列。
let checker = (arr, target) => target.every(v => arr.includes(v));
所以我的假設是遍歷“工具”陣列并以這種方式執行檢查,但這在邏輯上似乎不正確?
如果這些是 2 個直接向上的字串陣列,我可以做一個簡單的 include() 運算子并完成。
我該如何從這里繼續前進?我正在考慮將單個名稱屬性從陣列中拉出到代理陣列中,因此它是兩個字串陣列,但我覺得這比使用 some() 或 every() 效率低得多。
編輯:我不確定我是否清楚,但我正在檢查工具陣列中的“名稱”屬性。
感謝您的任何指導。
uj5u.com熱心網友回復:
您可以從目標陣列創建一個Set,然后減少物件的陣列( )并從累加器中arr洗掉每個找到的專案(在本例中)。name如果sizeSet 的 是0,則在陣列中找到所有目標:
const checker = (cb, arr, target) => !arr.reduce((acc, o) => {
acc.delete(cb(o))
return acc
}, new Set(target)).size
const tools = [{"name":"React","image":"react.svg"},{"name":"Firebase","image":"firebase.svg"},{"name":"CSS","image":"css.svg"}]
console.log(checker(o => o.name, tools, ["React", "Firebase"]))
console.log(checker(o => o.name, tools, ["React", "Firebase", "Cats"]))
使用 TS 型別(TS Playground):
const checker = <T>(
cb: (o: any) => T,
arr: any[],
target: T[]
): boolean => !arr.reduce((acc: Set<T>, o: any) => {
acc.delete(cb(o))
return acc
}, new Set(target)).size
uj5u.com熱心網友回復:
一個非常簡單的解決方案是使用 array.prototpye.some() 方法。它會
const tools = [
{name:"React", image:"react.svg"},
{name:"Firebase", image:"firebase.svg"},
{name:"CSS", image:"css.svg"},
]
const arr = ["React", "Firebase"]
function findCommon(arr1, arr2){
arr1.forEach(obj => {
const key = Object.values(obj)
console.log(key.some(item => arr2.includes(item)))
}
)
}
findCommon(tools, arr);
uj5u.com熱心網友回復:
我認為最簡單的解決方案是使用.some():
const tools = [
{name:"React", image:"react.svg"},
{name:"Firebase", image:"firebase.svg"},
{name:"CSS", image:"css.svg"},
];
const arr = ["React", "Firebase"]
const result = arr.every((item) => tools.some((tool) => tool.name === item));
console.log(result); // returns true
uj5u.com熱心網友回復:
我正在考慮將單個名稱屬性從陣列中拉出到代理陣列中,因此它是兩個字串陣列,但我覺得這比使用
some()or效率低得多every()。
這是迄今為止最簡單的方法。
map在工具陣列上并獲得一個名稱陣列。然后檢查過濾器陣列是否包含所有這些。
const tools = [
{name:'React', image:'react.svg'},
{name:'Firebase', image:'firebase.svg'},
{name:'CSS', image:'css.svg'}
];
const arr = ['React', 'Firebase'];
const arr2 = ['React', 'Firebase', 'Steve'];
const arr3 = ['React', 'Firebase', 'CSS'];
const arr4 = ['Firebase'];
const arr5 = ['Steve'];
function contains(tools, arr) {
const names = tools.map(obj => obj.name);
return arr.every(el => names.includes(el));
}
console.log(contains(tools, arr));
console.log(contains(tools, arr2));
console.log(contains(tools, arr3));
console.log(contains(tools, arr4));
console.log(contains(tools, arr5));
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/429996.html
標籤:javascript 打字稿
下一篇:未呼叫useEffect函式
