[英]Filtering data in a JSON array
我有一個像這樣的JSON數組:
json = [{
"a":"ABABABAB",
"b":30,
"c":"available"
},
{
"a":"A",
"b":30,
"c":"unavailable"
},
{
"a":"AB",
"b":29,
"c":"available"
},
{
"a":"ABAABACDA",
"b":29,
"c":"available"
},
{
"a":"ABAABACDA",
"b":29,
"c":"available"
}];
>= 3
; (例如: ABABABAB = 8
) ["ABABABA", "ABABA"]
-> 12) 到目前為止我做了什么
一種。 對於a
應該是唯一的:
unique_a = [];
for (i = 0; i < json.length; i++) {
if (unique_a.indexOf(json[i].a) === -1) {
unique_a.push(json[i].a);
}
}
b。 對於>= 3
:
var sort_3 = unique_a.filter(el => el.a.length >= 3);
對於所有a.length
的總數,可以使用一個簡單的forEach()
循環並將長度添加到變量中:
var total = 0;
unique_a.forEach(function(u) {
total += u.length;
});
console.log(total);
您可以通過鏈接方法使用JS Array.map Array.fileter Array.reduce實現
function countUniqueTextLengths(arr) { return arr.map((a) => aa).filter((a, i, ar) => ar.indexOf(a) == i && a.length > 4).reduce((t, v) => t + v.length, 0) } //optimized function countUniqueTextLengths_2(arr) { var u = [], c = 0; arr.forEach(element => { if (u.indexOf(element.a) === -1 && element.a.length > 4) { u.push(element.a); c += element.a.length; } }); return c; } var json = [{ "a": "ABABABAB", "b": 30, "c": "available" }, { "a": "A", "b": 30, "c": "unavailable" }, { "a": "AB", "b": 29, "c": "available" }, { "a": "ABAABACDA", "b": 29, "c": "available" }, { "a": "ABAABACDA", "b": 29, "c": "available" } ]; console.log(countUniqueTextLengths(json)) console.log(countUniqueTextLengths_2(json))
這可以通過幾個簡單的鏈接步驟完成:
reduce()
數組以應用我們的過濾器(唯一,且length > 3
)
join()
將結果轉換為單個字符串
獲取該字符串的.length
var json = [{ "a": "ABABABAB", "b": 30, "c": "available" }, { "a": "A", "b": 30, "c": "unavailable" }, { "a": "AB", "b": 29, "c": "available" }, { "a": "ABAABACDA", "b": 29, "c": "available" }, { "a": "ABAABACDA", "b": 29, "c": "available" }]; let result = json .reduce( (a,i) => !a.includes(ia) && ialength > 3 ? [...a, ia] : a , []) .join("") .length; console.log(result);
說明
1. .reduce()
獲取我們現有的數組項( i
),並從它們中創建一個新項( a
)。
.reduce( (a,i) =>
!a.includes(i.a) && i.a.length > 3 //If not yet in our resulting array and length > 3
? [...a, i.a] //Add it to the resulting array
: a //Else, leave the array alone
, []) //The initial value of our resulting array
這給我們留下了:
[
"ABABABAB",
"ABAABACDA"
]
2.然后,我們可以將.join("")
組合成一個字符串:
"ABABABABABAABACDA"
3.最后, .length
給我們該字符串中的字母數量:
17
使用lodash
https://lodash.com/
var json = [{ "a":"ABABABAB", "b":30, "c":"available" }, { "a":"A", "b":30, "c":"unavailable" }, { "a":"AB", "b":29, "c":"available" }, { "a":"ABAABACDA", "b":29, "c":"available" }, { "a":"ABAABACDA", "b":29, "c":"available" }]; var uniq = _.uniqBy(json, 'a'); var result = _.filter(uniq, function(value, key) { return value.a.length >= 3; }); //console.log(result); var lengths = _.map(_.map(result, 'a'), function(str){ return str.length }); var sum = _.reduce(lengths, (a, b) => a + b, 0); console.log(sum);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.