在数组中查找唯一属性并计算匹配项

时间:2019-05-18 17:01:57

标签: javascript

我想使用属性category在此数组中找到匹配的项目,在此应用中,每个用户都可以具有自定义类别,因此服务器在运行该功能之前无法知道类别的名称。

0: {amount: "123", category: "drinks", location: "NYC", note: "piano bar", receipt: "img.jpg", …}
1: {amount: "123", category: "drinks", location: "NYC", note: "piano bar", receipt: "img.jpg", …}
2: {amount: "123", category: "bills", location: "NYC", note: "piano bar", receipt: "img.jpg", …}
3: {amount: "123", category: "savings", location: "NYC", note: "piano bar", receipt: "img.jpg, ...}

到目前为止,这是我的代码

fetch = () => {
    this.setState({ loading: true });
    const { currentUser } = fire.auth();
    var stamp = moment().format('LLLL');
    const wallet = fire.database().ref(`/master/${currentUser.uid}/wallets/cash/income/transactions/20190520`);
    wallet.on('value', snapshot => {
      var data = snapshot.val();
      var categories = []
      for (let i in data) {
        categories.push(data[i].category)
      };
      console.log(categories);
      this.setState({ loading: false, ok: true });
    })
  }

这里我的目标是找到此数组中的所有类别,并将其存储在{drinks,bills,savings}之类的值中,然后查看与该类别相匹配的项有多少,例如

  • 喝2
  • 账单1
  • 储蓄1

4 个答案:

答案 0 :(得分:2)

您可以使用reduce来获取所有类别,并计算与每个类别关联的数组元素的数量。

const arr = [{amount: "123", category: "drinks", location: "NYC", note: "piano bar", receipt: "img.jpg"}, {amount: "123", category: "drinks", location: "NYC", note: "piano bar", receipt: "img.jpg"}, {amount: "123", category: "bills", location: "NYC", note: "piano bar", receipt: "img.jpg"}, {amount: "123", category: "savings", location: "NYC", note: "piano bar", receipt: "img.jpg"}];

let categories = arr.reduce((acc, obj) => {
  let category = obj.category;
  if (category in acc) {
    acc[category] += 1;
  } else {
    acc[category] = 1;
  }
  return acc;
}, {});

console.log(categories);
// { drinks: 2, bills: 1, savings: 1 }

答案 1 :(得分:0)

您可以使用Es6 Map类将键存储为类别,将值存储为匹配元素的数组。 Map还提供了许多方法,您可以check here

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;

import java.io.FileReader;
import java.io.Reader;

public class Test2 {
  public static void main(String[] args) throws Exception {
    Reader in =
        new FileReader(
            "przedmioty.csv");
    Iterable<CSVRecord> records =
        CSVFormat.TDF
    .withRecordSeparator("\r\n")
            .withFirstRecordAsHeader()
            .withHeader("Name", "Teacher", "Years")
            .withIgnoreHeaderCase()
            .parse(in);

    for (CSVRecord csvRecord : records) {
      String name = csvRecord.get(1);
      // Accessing the values by column header name
      String Teacher = csvRecord.get(2);
      String years = csvRecord.get(3);

      // Printing the record
      System.out.println("Record Number -> " + csvRecord.getRecordNumber());
      System.out.println("Name: " + name);
      System.out.println("Teacher: " + Teacher);
      System.out.print("Years : " + years);
      System.out.println("\n\n");
    }
  }
}

答案 2 :(得分:0)

您可以尝试将for用于每个循环并对其进行迭代,然后将计数保存在对象中

    let data = [
{amount: "123", category: "drinks", location: "NYC", note: "piano bar", receipt: "img.jpg"},
{amount: "123", category: "drinks", location: "NYC", note: "piano bar", receipt: "img.jpg"},
{amount: "123", category: "bills", location: "NYC", note: "piano bar", receipt: "img.jpg"},
{amount: "123", category: "savings", location: "NYC", note: "piano bar", receipt: "img.jpg"}];

let countObj = {};
data.forEach((val,ind)=>{
    if(countObj[val.category]){
        countObj[val.category] = countObj[val.category] + 1 ;
  }else{
    countObj[val.category] = 1;
  }
})
console.log(countObj);

给出结果

bills: 1
drinks: 2
savings: 1

答案 3 :(得分:0)

您可以使用array.includes来查看您的值是否已经存在,并在另一个数组中计算数量,如下所示:

 fetch = () => {
        this.setState({ loading: true });
        const { currentUser } = fire.auth();
        var stamp = moment().format('LLLL');
        const wallet = fire.database().ref(`/master/${currentUser.uid}/wallets/cash/income/transactions/20190520`);
        wallet.on('value', snapshot => {
          var data = snapshot.val();
          var categories = [];
          var amounts = [];
          for (let i in data) {
            if(categories.includes(data[i].category){
                if(amounts[data[i].category] == undefined){
                   amounts[data[i].category]=1;
                }else{
                   amounts[data[i].category]++;
                }
            }
            categories.push(data[i].category)
          };
          console.log(amounts);
          this.setState({ loading: false, ok: true });
        })
      }