Javascript计算json数组中的不同值和总和列表

时间:2018-04-12 22:39:57

标签: javascript json underscore.js lodash

例如,在以下json数组中,每个元素都有nametracks.items

中项目的变量列表
[
    {
    "name": "whatever",
    "tracks": {
        "items": 
        [
            {
             "item 1" : "some item" 
            },
            ...
        ]
        }
    },
    {...}
    ...
]

在javascript中,我需要找到不同name的数量,以及整个数组中找到的所有tracks.items的长度(大小)之和。
我如何使用下划线或lodash来做到这一点?我已经尝试了_.countBy(),但这只会返回个别计数

修改
谢谢你们 (替代解决方案)
const uniqueNames = new Set(array.map(item => item.name)).size const totalItems = array.reduce((sum, item) => sum + item.tracks.items.length, 0)

2 个答案:

答案 0 :(得分:1)

let obj = [{
    "name": "whatever",
    "tracks": {
        "items": 
        [
            {
                "item 1" : "some item" 
            },
            ...
        ]
        }
    },
    {...}
    ...
];

let uniqueNames = _.uniqBy(obj, 'name').length;
let totalItemes = _.reduce(obj, (result, value) => result += value.tracks.items.length, 0);

工作示例:



var obj = [{
  "name": "whatever",
  "tracks": {
    "items": [{
        "item 1": "some item"
      },
      {
        "item 2": "some item"
      }, {
        "item 3": "some item"
      }
    ]
  }
}, {
  "name": "whatever",
  "tracks": {
    "items": [{
        "item 4": "some item"
      },
      {
        "item 5": "some item"
      }, {
        "item 6": "some item"
      }, {
        "item 7": "some item"
      }
    ]
  }
}, {
  "name": "whatever2",
  "tracks": {
    "items": [{
        "item 8": "some item"
      },
      {
        "item 9": "some item"
      }, {
        "item 10": "some item"
      }, {
        "item 11": "some item"
      }
    ]
  }
}]
let names = _.uniqBy(obj, 'name');
let uniqueNames = names.length
let items = _.reduce(obj, (result, value) => result += value.tracks.items.length, 0)
console.log(names);
console.log(uniqueNames)
console.log(items)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

作为Stucco noted in his answer,您可以通过name检查_.uniqBy()的结果长度来获取唯一名称的数量。

您可以使用_.sumBy()获取曲目项目的总金额。

&#13;
&#13;
var arr = [{"name":"whatever","tracks":{"items":[{"item 1":"some item"},{"item 2":"some item"},{"item 3":"some item"}]}},{"name":"whatever","tracks":{"items":[{"item 4":"some item"},{"item 5":"some item"},{"item 6":"some item"},{"item 7":"some item"}]}},{"name":"whatever2","tracks":{"items":[{"item 8":"some item"},{"item 9":"some item"},{"item 10":"some item"},{"item 11":"some item"}]}}];

var uniqueNamesCount = _.uniqBy(arr, 'name').length;
var totalTracksItemsCount = _.sumBy(arr, 'tracks.items.length');

console.log('uniqueNamesCount', uniqueNamesCount); // 2
console.log('totalTracksItemsCount', totalTracksItemsCount); // 11
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
&#13;
&#13;
&#13;