所以,我有這個稱為“字符”的物件陣列(目前只有 3 個物件,但應該更多),我想用一個函式(或陣列方法)過濾這個陣列,例如:回傳每個字符的名稱,誰是character.bodyType: "tall"或擁有character.element: "fire"AND 也是character.weapon: "sword"用戶,這取決于我傳遞給函式的引數值的數量。
我撰寫了一個函式“isThere”,它最多接受 4 個引數,但我希望能夠使用小于 4 的任意數量的值呼叫它,并僅根據這些引數值獲取名稱。假設我只想顯示既高又男性的角色的名字。結果應該是['Igneus'],但是我得到[ 'Renna', 'Igneus', 'Igneus', 'Dagon' ]了,但我無法弄清楚它的邏輯,它只過濾滿足這兩個要求并跳過重復項和只滿足其中一個要求的那些。如果我只想查看“劍”字符的名稱,結果應該是["Renna" , "Igneus]......等等。
我的代碼顯然未完成且錯誤,我嘗試了幾種不同的 if 陳述句方法,這就是我停下來的地方。如果可以使用陣列方法,那又短又干凈,我會接受。我嘗試了 Array.filter() 方法,但我只是不知道如何在其中實作 4 引數函式,或者它是否可能。
const characters = [
{
bodyType: "tall",
element: "air",
gender: "female",
name: "Renna",
weapon: "sword",
},
{
bodyType: "tall",
element: "fire",
gender: "male",
name: "Igneus",
weapon: "sword",
},
{
bodyType: "medium",
element: "water",
gender: "male",
name: "Dagon",
weapon: "spear",
},
];
function isThere(body, element, gender, weapon) {
const arr = [];
for (const char of characters) {
if (char.bodyType === body) {
arr.push(char.name)
}
if(char.element === element){
arr.push(char.name)
}
if(char.gender === gender){
arr.push(char.name)
}
if(char.weapon === weapon){
arr.push(char.name)
}
}
return arr;
}
isThere("tall", undefined, "male", undefined)
uj5u.com熱心網友回復:
新概念:咖喱
const characters = [
{
bodyType: "tall",
element: "air",
gender: "female",
name: "Renna",
weapon: "sword",
},
{
bodyType: "tall",
element: "fire",
gender: "male",
name: "Igneus",
weapon: "sword",
},
{
bodyType: "medium",
element: "water",
gender: "male",
name: "Dagon",
weapon: "spear",
},
];
const partialMatch = (object) => (character) => Object.entries(object).every(([key,value]) => character[key] === value)
const myMatchingCharacters = characters.filter(partialMatch({bodyType:'tall',gender:'male'}))
console.log(myMatchingCharacters.map(({name}) => name))
uj5u.com熱心網友回復:
目前,您的代碼充當一個巨大的“或”——如果滿足任何條件,它就會推送名稱。您實際上是在尋找“和”。另外,如果沒有指定條件,字符應該立即通過條件,這就是我添加(typeof ... !== "undefined" ? ... : ...).
const characters = [{
bodyType: "tall",
element: "air",
gender: "female",
name: "Renna",
weapon: "sword",
},
{
bodyType: "tall",
element: "fire",
gender: "male",
name: "Igneus",
weapon: "sword",
},
{
bodyType: "medium",
element: "water",
gender: "male",
name: "Dagon",
weapon: "spear",
},
];
function isThere(body, element, gender, weapon) {
const arr = [];
for (const char of characters) {
if ((typeof body === "undefined" ? true : char.bodyType === body) &&
(typeof element === "undefined" ? true : char.element === element) &&
(typeof gender === "undefined" ? true : char.gender === gender) &&
(typeof weapon === "undefined" ? true : char.weapon === weapon)) {
arr.push(char.name)
}
}
return arr;
}
console.log(isThere("tall", undefined, "male", undefined));
uj5u.com熱心網友回復:
如果 OP 不想清楚地撰寫每個filter方法,例如 ...
-
(({ bodyType, element, gender, name, weapon }) => (bodyType === 'tall' || element === 'fire') && weapon === 'sword' ) -
(({ bodyType, element, gender, name, weapon }) => bodyType === 'tall' && gender === 'male' )
...但想使用類似物件的配置,那么 OP 需要想出一些輔助方法,例如
every并且any每個都根據傳遞的配置創建一個過濾器函式- 以及每個創建單個過濾器函式
and的or位置,該過濾器函式確實根據輔助方法的邏輯含義/目的處理過濾器函式串列。
function every(config) {
return (item => Object
.entries(config)
.every(([key, value]) =>
item[key] === value
)
);
}
function any(config) {
return (item => Object
.entries(config)
.some(([key, value]) =>
item[key] === value
)
);
}
function and(...requirements) {
return (item => requirements
.every(requirement =>
requirement(item)
)
);
}
function or(...requirements) {
return (item => requirements
.some(requirement =>
requirement(item)
)
);
}
const characters = [{
bodyType: "tall",
element: "air",
gender: "female",
name: "Renna",
weapon: "sword",
}, {
bodyType: "tall",
element: "fire",
gender: "male",
name: "Igneus",
weapon: "sword",
}, {
bodyType: "medium",
element: "water",
gender: "male",
name: "Dagon",
weapon: "spear",
}];
// OP ... > who is character.bodyType: "tall"
// > or has character.element: "fire"
// > AND is also character.weapon: "sword"
console.log(
'({ bodyType: "tall" } OR { element: "fire" }) AND { weapon: "sword" } ... conventionally ...',
characters
.filter(({ bodyType, element, gender, name, weapon }) =>
(bodyType === 'tall' || element === 'fire') && weapon === 'sword'
)
);
console.log(
'({ bodyType: "tall" } OR { element: "fire" }) AND { weapon: "sword" } ... by helper functions ...',
characters
.filter(
and(
any({ bodyType: "tall", element: "fire" }),
any({ weapon: "sword" })
)
)
);
// OP ... > Let's say I want to display only the names
// > of characters who are both tall and male.
console.log(
'{ bodyType: "tall" } AND { gender: "male" } ... conventionally ...',
characters
.filter(({ bodyType, element, gender, name, weapon }) =>
bodyType === 'tall' && gender === 'male'
)
);
// either ...
console.log(
'{ bodyType: "tall" } AND { gender: "male" } ... by helper functions ...',
characters
.filter(
and(
any({ bodyType: "tall" }),
any({ gender: "male" })
)
)
);
// ... or.
console.log(
'{ bodyType: "tall" } AND { gender: "male" } ... by helper functions ...',
characters
.filter(
every({ bodyType: "tall", gender: "male" }),
)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
uj5u.com熱心網友回復:
可以使用 args 上的rest 語法和陣列方法every()來實作。
const characters=[{bodyType:"tall",element:"air",gender:"female",name:"Renna",weapon:"sword"},{bodyType:"tall",element:"fire",gender:"male",name:"Igneus",weapon:"sword"},{bodyType:"medium",element:"water",gender:"male",name:"Dagon",weapon:"spear"}];
const isThere = (...args) =>
characters.filter(char =>
['bodyType', 'element', 'gender', 'weapon'].every((key, index) =>
args[index] === undefined || args[index] === char[key]
)
)
.map(({ name }) => name);
console.log(isThere("tall", undefined, "male", undefined));
console.log(isThere(undefined, undefined, undefined, "sword"));
uj5u.com熱心網友回復:
@Adam 的方法甚至可以縮短為單行,但可讀性會受到影響:
const characters = [
{
bodyType: "tall",
element: "air",
gender: "female",
name: "Renna",
weapon: "sword",
},
{
bodyType: "tall",
element: "fire",
gender: "male",
name: "Igneus",
weapon: "sword",
},
{
bodyType: "medium",
element: "water",
gender: "male",
name: "Dagon",
weapon: "spear",
},
];
const matched = characters.filter((crits=> pers => crits.every(([k,v]) => pers[k] === v))([['bodyType','tall'],['weapon','sword']]))
console.log(matched.map(({name}) => name))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/525292.html
上一篇:PHP-重繪或重新訪問時會話丟失
