【发布时间】:2022-01-29 19:44:20
【问题描述】:
我有一个看起来像这样的数据数组,其中一些是组类型并包含像独立类型这样的子项
const myArray = [{
name: "Bitcoin",
balance: 10,
}, {
name: "ETH",
tokens: [{
name: "Ethereum",
balance: 0,
}, {
name: "Chainlink",
balance: 5,
}],
}, {
name: "Solona",
balance: 0,
}];
我想做一个搜索和过滤标签,比如余额。我已经用这种方法实现了。
const searchString = "";
const hideZeroBalanceAsset = false;
const filterGroupToken = (groupToken) => {
const shallowCopy = { ...groupToken };
if (searchString) {
const isGroupNameMatchedSearch = shallowCopy.name
.toLowerCase()
.includes(searchString);
const subTokensMatchedSearch = shallowCopy.tokens.filter((subToken) =>
subToken.name.toLowerCase().includes(searchString)
);
if (subTokensMatchedSearch.length === 0 && !isGroupNameMatchedSearch)
return undefined;
if (
subTokensMatchedSearch.length > 0 &&
(subTokensMatchedSearch, length < shallowCopy.tokens.length)
) {
shallowCopy.tokens = subTokensMatchedSearch;
}
}
if (hideZeroBalanceAsset) {
const subTokensNonZeroBalance = shallowCopy.tokens.filter(
(subToken) => subToken.balance > 0
);
if (subTokensNonZeroBalance.length === 0) return undefined;
if (
subTokensNonZeroBalance.length > 0 &&
subTokensNonZeroBalance.length < shallowCopy.tokens.length
) {
shallowCopy.tokens = subTokensNonZeroBalance;
}
}
return shallowCopy;
};
const filterSingleToken = (token) => {
if (searchString) {
if (!token.name.toLowerCase().includes(searchString)) return undefined;
}
if (hideZeroBalanceAsset) {
if (token.balance === 0) return undefined;
}
return token;
};
const findMatchedTokensReducer = (matchedTokens, nextToken) => {
if (Array.isArray(nextToken.tokens)) {
const nextMatchedToken = filterGroupToken(nextToken);
if (nextMatchedToken) matchedTokens.push(nextMatchedToken);
} else {
const nextMatchedToken = filterSingleToken(nextToken);
if (nextMatchedToken) matchedTokens.push(nextMatchedToken);
}
return matchedTokens;
};
const myArray = [{
name: "Bitcoin",
balance: 10,
}, {
name: "ETH",
tokens: [{
name: "Ethereum",
balance: 0,
}, {
name: "Chainlink",
balance: 5,
}],
}, {
name: "Solona",
balance: 0,
}];
const filteredArray = myArray.reduce(findMatchedTokensReducer, []);
console.log({ filteredArray });
.as-console-wrapper { min-height: 100%!important; top: 0; }
但是我觉得这个实现臃肿且效率低下。特别是 filterGroupToken 函数,但因为我想在搜索字符串与其名称匹配时显示组类型的所有子项。
【问题讨论】:
标签: javascript arrays object filter