我需要回傳滿足某些條件的部分物件。我通過以下示例獲得 API 回應:
const response: ApiResponse = {
valid: true,
start: true,
stop: false
};
基于該回應,我需要檢查我的配置物件并檢查是否有一些物件符合回應。我的配置看起來像這樣(如果有更好的建模方法可以修改)
public readonly modalDataConfig: ModalDataConfig[] = [
{
conditions: [
{
start: true,
valid: true,
},
],
p1: {
title: `Name p1 A`,
description: `description p1 A`,
},
p2: {
title: `Name p2 B`,
description: `description p2 B`,
},
},
{
conditions: [
{
valid: false,
stop: true,
},
],
p1: {
title: `Name p1 C`,
description: `description p1 C`,
},
p2: {
title: `Name p2 C`,
description: `description p2 C`,
},
},
{
conditions: [
{
start: false,
valid: false,
},
],
p1: {
title: `Name p1 D`,
description: `description p1 D`,
},
p2: {
title: `Name p2 D`,
description: `description p2 D`,
},
},
];
所以我需要檢查modalDataConfig.conditions里面是否有滿足回應條件的物件。如果是,我需要從該物件回傳 p1 或 p2。我總是從 API 獲得 3 個條件,但我的配置條件通常只使用其中的 2 個。所以我需要檢查鍵和值。在示例中,我應該得到第一個物件,因為它的條件陣列具有 start: true 和 valid: true。 TSPlayground 編輯:我需要根據我事先知道的引數從正確的物件回傳 p1 或 p2。所以在這個例子中我可以假設:
const context = Producer.P1;
其中 AppContext 是列舉
enum Producer {
P1 = 'p1',
P2 = 'p2',
}
uj5u.com熱心網友回復:
編輯
我們還可以根據評論者的建議簡化我的解決方案!此函式無需使用 1/0,只需檢查陣列中的所有元素是否為真。
const checkResponse = (modalDataConfig, response) => {
let res = []
for (const conf of modalDataConfig) {
let cond = conf.conditions
let isSame = Object.keys(cond)
.map(key => response?.[key] == cond[key]).every(Boolean)
if (isSame) res.push(conf)
}
return res
}
筆記
在我的解決方案中,我假設我們只關心配置條件中的鍵:值對是否與回應中的鍵:值對相同,而不是相反。這意味著如果回應中存在密鑰但配置中不存在,我們不會使用該密鑰進行相似性檢查。
腳步
我將首先更改 ModelDataConfig 的建模方式,將
condition鍵的值替換為物件而不是物件陣列。我將首先遍歷每個元素
modelDataConfig在
conditions每個元素的物件中,我通過檢查 2 個條件來比較它的 key :responsevalueresponse與response如果它同時滿足這兩個條件,我回傳一個 1,否則回傳一個 0。最后,我得到一個 1 和 0 的陣列。為了
response滿足conditions,陣列中只能有 1,因為為零意味著它們的鍵甚至不存在于 中response,或者鍵具有不同的值。為了檢查是否只有 1,我使用按位 AND 運算子來減少陣列。如果歸約后的最終結果為 1,則表示 的特定元素
modelDataConfig就是您要查找的元素。
例子
const modalDataConfig = [{
conditions: {
start: true,
valid: true,
},
p1: {
title: `Name p1 A`,
description: `description p1 A`,
},
p2: {
title: `Name p2 B`,
description: `description p2 B`,
},
},
{
conditions: {
valid: false,
stop: true,
},
p1: {
title: `Name p1 C`,
description: `description p1 C`,
},
p2: {
title: `Name p2 C`,
description: `description p2 C`,
},
},
{
conditions: {
start: false,
valid: false,
},
p1: {
title: `Name p1 D`,
description: `description p1 D`,
},
p2: {
title: `Name p2 D`,
description: `description p2 D`,
},
},
{
conditions: {
start: false,
valid: true,
},
p1: {
title: `Name p1 D`,
description: `description p1 D`,
},
p2: {
title: `Name p2 D`,
description: `description p2 D`,
},
},
];
const checkResponse = (modalDataConfig, response) => {
let res = []
for (const conf of modalDataConfig) {
let cond = conf.conditions
let isSame = Object.keys(cond)
.map(key => key in response && response[key] == cond[key] ? 1 : 0)
.reduce((a, b) => a & b, 1)
if (isSame) res.push(conf)
}
return res
}
const response1 = {
valid: true,
start: false,
stop: true
};
console.log('Results with response1:')
console.log(checkResponse(modalDataConfig, response1))
const response2 = {
valid: false,
stop: true
};
console.log('Results with response2:')
console.log(checkResponse(modalDataConfig, response2))
uj5u.com熱心網友回復:
要找到滿足條件的物件,您需要將每個conditions物件分解為key并將value其結果與目標值進行比較ApiResponse
modalDataConfig=[{conditions:[{start:true,valid:true}],p1:{title:`Name p1 A`,description:`description p1 A`},p2:{title:`Name p2 B`,description:`description p2 B`}},{conditions:[{valid:false,stop:true}],p1:{title:`Name p1 C`,description:`description p1 C`},p2:{title:`Name p2 C`,description:`description p2 C`}},{conditions:[{start:false,valid:false}],p1:{title:`Name p1 D`,description:`description p1 D`},p2:{title:`Name p2 D`,description:`description p2 D`}}];
ApiResponse = {valid: true, start: true, stop: true};
const { p1, p2 } = modalDataConfig.find(({ conditions }) =>
Object.entries(conditions.at(0))
.every(([key, value]) => ApiResponse[key] === value));
console.log('P1 is:', p1, 'P2 is:', p2);
.as-console-wrapper { max-height: 100% !important; top: 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/457168.html
標籤:javascript 数组 打字稿 目的
