我有兩個包含物件的陣列,它們看起來類似于:
let comp1 = [
{ optionKey: 'option1', displayName: '' },
{ optionKey: 'option2', displayName: '' },
{ optionKey: 'option3', displayName: '' },
{ optionKey: 'option4', displayName: '' },
{ optionKey: 'option5', displayName: '' },
{ optionKey: 'option6', displayName: '' },
{ optionKey: 'option7', displayName: '' },
];
let comp2 = [
{ option1Options: [] },
{ option2Options: [] },
{ option3Options: ['On', 'Off'] },
{ option4Options: ['Auto ', 'Off'] },
{ option5Options: [] },
{ option6Options: [] },
];
我想要做的是,如果 comp2 長度中每個鍵的值為 0,我想洗掉該鍵而不Option從comp1. 到目前為止,我能夠做的是如果每個陣列的長度相等
let comp1 = [
{ optionKey: 'option1', displayName: '' },
{ optionKey: 'option2', displayName: '' },
{ optionKey: 'option3', displayName: '' },
{ optionKey: 'option4', displayName: '' },
{ optionKey: 'option5', displayName: '' },
{ optionKey: 'option6', displayName: '' },
{ optionKey: 'option7', displayName: '' },
];
let comp2 = [
{ option1Options: [] },
{ option2Options: [] },
{ option3Options: ['On', 'Off'] },
{ option4Options: ['Auto ', 'Off'] },
{ option5Options: [] },
{ option6Options: [] },
];
comp1.forEach(function (item) {
var index = comp2.findIndex(function (item2, i) {
return item2[item.optionKey 'Options'] !== undefined;
});
if (index !== -1) {
if (comp2[index][item.optionKey 'Options'].length === 0) {
comp1.splice(index, 1);
}
}
});
console.log(comp1)
但在我的情況下comp1,comp2長度是不同的。我應該如何通過鍵的值洗掉它comp1?對此有任何幫助。
uj5u.com熱心網友回復:
您可以簡單地filter()使用 comp1some()呼叫來檢查 comp2 中是否存在任何選項陣列。這里使用可選鏈接來避免 comp2 中不存在的元素
let comp1 = [{ optionKey: 'option1', displayName: '' }, { optionKey: 'option2', displayName: '' }, { optionKey: 'option3', displayName: '' }, { optionKey: 'option4', displayName: '' }, { optionKey: 'option5', displayName: '' }, { optionKey: 'option6', displayName: '' }, { optionKey: 'option7', displayName: '' },];
let comp2 = [{ option1Options: [] }, { option2Options: [] }, { option3Options: ['On', 'Off'] }, { option4Options: ['Auto ', 'Off'] }, { option5Options: [] }, { option6Options: [] },];
const result = comp1.filter(o =>
comp2.some(option => option[`${o.optionKey}Options`]?.length > 0)
);
console.log(result);
uj5u.com熱心網友回復:
我認為一個簡單的組合filter()應該some()可以讓你到達那里:
const comp1 = [
{ optionKey: 'option1', displayName: '' },
{ optionKey: 'option2', displayName: '' },
{ optionKey: 'option3', displayName: '' },
{ optionKey: 'option4', displayName: '' },
{ optionKey: 'option5', displayName: '' },
{ optionKey: 'option6', displayName: '' },
{ optionKey: 'option7', displayName: '' },
];
const comp2 = [
{ option1Options: [] },
{ option2Options: [] },
{ option3Options: ['On', 'Off'] },
{ option4Options: ['Auto ', 'Off'] },
{ option5Options: [] },
{ option6Options: [] },
];
const result = comp1.filter(({optionKey}) => comp2.some(v => v[`${optionKey}Options`]?.length));
console.log(result);
uj5u.com熱心網友回復:
您正在拼接您在 內部迭代的陣列forEach,這導致陣列跳過下一個元素。例如,如果您有專案 1-2-3-4-5-6,并且正在執行的測驗意味著應該洗掉所有專案,那么您首先要洗掉 1,跳過 2,洗掉 3,跳過 4,洗掉 5 , 并跳過 6。
雖然可以進行重構以使索引不會產生此問題(例如for回圈),但更好的方法是首先完全迭代,確定要洗掉的選項,comp2然后呼叫.filter.comp1
let comp1 = [
{ optionKey: 'option1', displayName: '' },
{ optionKey: 'option2', displayName: '' },
{ optionKey: 'option3', displayName: '' },
{ optionKey: 'option4', displayName: '' },
{ optionKey: 'option5', displayName: '' },
{ optionKey: 'option6', displayName: '' },
{ optionKey: 'option7', displayName: '' },
];
let comp2 = [
{ option1Options: [] },
{ option2Options: [] },
{ option3Options: ['On', 'Off'] },
{ option4Options: ['Auto ', 'Off'] },
{ option5Options: [] },
{ option6Options: [] },
];
const optionsToRemove = comp2
.filter(obj => !Object.values(obj)[0].length)
.map(obj => Object.keys(obj)[0].replace(/Options$/, ''));
const output = comp1.filter(
({ optionKey }) => !optionsToRemove.includes(optionKey)
);
console.log(output);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/508890.html
標籤:javascript
上一篇:變數在IF條件內不生效
