【问题标题】:How to to filter an array of 1 depth nested object efficiently如何有效过滤1深度嵌套对象的数组
【发布时间】: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


    【解决方案1】:

    好吧,我认为这可以帮助您解决排序问题。

    const myArray = [
      {
        name: "Bitcoin",
        balance: 10,
      },
      {
        name: "ETH",
        tokens: [
          {
            name: "Ethereum",
            balance: 0,
          },
          {
            name: "Chainlink",
            balance: 5,
          },
        ],
      },
      {
        name: "Solona",
        balance: 0,
      },
    ];
    
    const filter = {name: "ETH", subName: "Ethereum"}
    
    let filteredData = myArray.find((money) => money.name === filter.name)
    
    const hasSubValues = filteredData.tokens && filteredData.tokens.length > 0 && filter.subName !== undefined
    
    if(hasSubValues){
        filteredData = filteredData.tokens.find((m) => {
            return m.name === filter.subName
        })
    }
    
    console.log(filteredData);

    【讨论】:

      猜你喜欢
      • 2019-01-29
      • 2020-09-24
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多