过滤JSON数组中的数据

时间:2018-12-12 05:21:14

标签: javascript arrays json

我有一个像这样的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"
}];
  1. 我必须根据以下两个条件过滤掉JSON数据:
    一种。 “ a”的值应该唯一,
    b。 “ a”的值的计数应为>= 3; (例如:ABABABAB = 8
  2. 获取过滤后的数组中每个字符串的长度并将其求和。 (例如:["ABABABA", "ABABA"]-> 12)

到目前为止我所做的。.

a。 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);

4 个答案:

答案 0 :(得分:2)

对于所有a.length的总数,您可以使用简单的forEach()循环并将长度添加到变量中:

var total = 0;

unique_a.forEach(function(u) {
  total += u.length;
});

console.log(total);

答案 1 :(得分:1)

您可以使用JS Array.map Array.fileter Array.reduce通过链接方法来实现

function countUniqueTextLengths(arr) {

  return arr.map((a) => a.a).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))

答案 2 :(得分:1)

这可以通过几个简单的链接步骤完成:

  1. reduce()数组以应用我们的过滤器(唯一和length > 3

  2. join()的结果放入单个字符串

  3. 获取该字符串的.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(i.a) && i.a.length > 3 ? [...a, i.a] : 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

答案 3 :(得分:-1)

使用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>