如何对这个json数据进行筛选?【已搞定】
发布于 10 年前 作者 heixiaoshan 17915 次浏览 最后一次编辑是 8 年前 来自 问答

json数据如下: { “R001” : { “A” : false, “B” : false },“R002” : { “A” : false, “B” : true },…}

我需要的结果是 R002以及R002中的B,其他的都不需要。请问大神怎么处理?不要理论,只要干货。谢谢 为什么只要B呢,因为B=true,也就是,只要有true的就取出来。 只要value=true的全部提取出来。

12 回复

var data = { “R001” : { “A” : false, “B” : false },“R002” : { “A” : false, “B” : true },…};

var r2 = data.R002; var r2b = data.R002.B;

var result = []; for(var k in data){ result[result.length] = data[k].B; }

@russj 你这个好像。。。,为什么只要B呢,因为B=true,也就是,只要有true的就取出来。

@chloe 额,不好意思。应该是只要等于true的值和他的上一级key

求大神来袭啊。

@heixiaoshan


  var data = {"R001":{"A":false,"B":false},"R002":{"A":false,"B":true}};

  var getTrue = function (obj) {
    var results = [];

    // 每一次呢,都把自己的子对象丢进去再检测一遍,没有就停了。
    (function(obj){
      for(var k in obj) {
        if(obj[k] === true) {
          results.push(obj);
        }

        // 重新调用了自己
        arguments.callee(obj[k]);
      }
    })(obj);

    return results;
  }

  var results = getTrue(data);

我写了一个,不知道符不符合你的需求。

@heixiaoshan

keys = []

getTrue = (_obj,_objname)->
	for k,v of _obj
		if k is 'B' and v is true
  			keys.push _objname
		if typeof v is 'object'
      		getTrue v,k

感觉差不多,测试用例

obj =
	r1:
		r11:
  			A:false
  			B:true
		r12:true
	r2:
		A:false
		B:
  		    r3:
    			A:false
				B:true
	r4:
		A:false
		B:true

getTrue obj,'obj'

console.log keys

//输出
//[ 'r11', 'r3', 'r4' ]

LZ的意思是pick出value为true的key以及其父key吧? 应该跟AB一点关系都没有吧?
http://jsfiddle.net/abruzzi/ztdyhxdq/6/

var x = {R1: {A: false, B: true}, R2: {A: true, B: false}, R3: {A: true, B: false, C: true}};
var result = [];

var pick = function (origin, parent) {
    var current = [];
    for (var k in origin) {
        if (origin[k] === true) current.push(k);
        if (typeof origin[k] === 'object') pick(origin[k], k);
    }
    if (current.length > 0) result[parent] = current;
}           
            
pick(x, null) || console.log(result);

LZ的问题是啥呢?是不会写呢?还是自己写了一个觉得效率不够高?

@yeaha 其实呢,中间还是涉及很多东西,主要是桌面跟互联网端交互。

@zhou-yg 多谢回复。谢谢。已经搞定。

@think2011 多谢,已经搞定。

回到顶部