【问题标题】:Counting objects based on nested key value基于嵌套键值计算对象
【发布时间】:2019-07-24 21:29:45
【问题描述】:

已编辑 我有这个嵌套的 json,我想搜索一个值,然后返回找到该值的整个对象并计算这些对象并使用映射和过滤器重新创建对象。我不知道该怎么做,因为我是编程新手。

在示例 json 中,我想搜索水果的值,然后计算所有带有日期的水果的值的对象总数。

示例 Json 对象:

var sampleData = [
 {
   fruitData: {
     fruit: 'apple',
     price: 23
   },
   dateCreated: '2019-07-23T00:20:36.535Z'
 },
 {
   fruitData: {
     fruit: 'apple',
     price: 36 
   },
   dateCreated: '2019-07-23T00:30:32.135Z'
 },
 {
   fruitData: {
     fruit: 'apple',
     price: 36 
   },
   dateCreated: '2019-07-24T00:10:36.115Z'
 },
 {
   fruitData: {
     fruit: 'mango',
     price: 40 
   },
   dateCreated: '2019-07-24T01:25:32.835Z'
 },
]

我希望输出是这样的,并在搜索水果的价值后计数

var filteredData= [
 {
   '07-23-2019': {
       'apple': 2
   },
   '07-24-2019': {
       'apple': 1,
       'mango': 1
   }
 }
]

感谢那些愿意提供帮助的人

【问题讨论】:

  • 数据总是采用这种格式吗?
  • 是的,它将始终采用这种格式

标签: javascript jquery arrays json


【解决方案1】:

假设JSON是结构化的,我们可以得到fruits的值:

function fruitCount(sampleData) {
    var results = {};

    // sampleData is a list, so for each item
    sampleData.forEach((container) => {

        // Get the relevant data from the subfields.
        let date = container.dateCreated;
        let fruit = container.fruitData.fruit;

        // If the date has been found before, we'll reuse it.
        // If the fruit has been found before, we'll increment it.
        // If the fruit has NOT been found before, we'll insert it with a
        //     value of 1.
        if (date in results) {
            results[date][fruit] = results[date][fruit] + 1 || 1;

        // The date has not been found before, so create it.
        } else {
            results[date] = {fruit: 1};
        }
    });

    return results;
}
if (date in results) {
    results[date][fruit] = results[date][fruit] + 1 || 1;

相当于

if (date in results) {
    if (fruit in results[date]) {
        results[date][fruit]++;
    } else {
        results[date][fruit] = 1;
    }
}

【讨论】:

  • 谢谢迈克尔,这也有效..感谢另一个解决方案。但这可以使用 array.filter() 和 array.map() 来实现吗?我想投票,但我不能,因为我的声望低于 15。
  • 对不起,我更改了输出,请参阅我编辑的主题的示例,我忘记还应该包括日期..
  • 谢谢,最后一件事,你能给我解释一下每一行代码吗?在代码中使用 cmets 对我会有很大的帮助。
【解决方案2】:
const sampleData = [
    {
        fruitData: {
            fruit: 'apple',
            price: 23
        },
        dateCreated: '07-23-2019'
    },
    {
        fruitData: {
            fruit: 'apple',
            price: 36
        },
        dateCreated: '07-23-2019'
    },
    {
        fruitData: {
            fruit: 'mango',
            price: 40
        },
        dateCreated: '07-23-2019'
    },
];


function groupData(data, key) {
    const objs = {};
    for (const obj of data) {
        objs[obj[key].fruit] = (objs[obj[key].fruit] || 0) + 1;
    }
    return objs;
}

const data = groupData(sampleData, 'fruitData');

如果你希望数据是一个数组,那么把最后一行改成这个

const data = [groupData(sampleData, 'fruitData')];

【讨论】:

  • 嗨,Jamal,这也有效.. 感谢您提供另一个解决方案。但这可以使用 array.filter() 和 array.map() 来实现吗?我想投票,但我不能,因为我的声望低于 15。
  • 对不起,我更改了输出,请参阅我编辑的主题的示例,我忘了还应该包括日期..
猜你喜欢
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多