仅对某些属性进行模糊搜索深度数组

时间:2016-10-25 20:00:01

标签: javascript lodash

我有一个JSON数据集,它返回时可能非常大,每个对象都有以下结构:

const iteratees = ['ctr', 'property.value', 'status.stage']

现在我想搜索数组中的所有对象并仅返回包含某种字符串的对象,但我只想搜索某些属性。

我基本上有另一个包含我想要搜索的键的数组,例如

static private Int32 AttendeeRef; static public int attendeeref { get { return AttendeeRef; } set { if (value <= 40000 && value >= 60000) { throw new ArgumentException("Attendee Ref must be between 40000 and 60000!"); } AttendeeRef = value; } }

我在项目中有lodash,但我不知道从哪里开始。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用filter()some()reduce()来执行此操作。

const iteratees = ['ctr', 'property.value', 'status.stage'];
var searchFor = 'lo';

var result = arr.filter(function(o) {
  return iteratees.some(function(e) {
    var res = e.split('.').reduce(function(a, b) {
      if(a) return a[b];
    }, o);
    if(res) {
      if((res).toString().indexOf(searchFor) != -1) return true;
    }
  })
})

&#13;
&#13;
var arr = [{
  "ctr": 'lorem',
  "averageECPC": 23,
  "cost": 2732.54,
  "margin": 66,
  "profit": 2495.9,
  "property": {
    "value": "Izzby",
    "uri": "/Terrago/2"
  },
  "status": {
    "content": "<p>Some Content</p>",
    "stage": 1
  },
  "alerts": {
    "status": 2
  },
  "revenue": {
    "value": 2573.13,
    "compare": 0
  },
  "children": [{
    "ctr": 79,
    "averageECPC": 54,
    "cost": 3554.78,
    "margin": 88,
    "profit": 3145.81,
    "property": {
      "value": "Comvex",
      "uri": "/Octocore/4"
    },
    "status": {
      "content": "<p>Some Content</p>",
      "stage": 1
    },
    "alerts": {
      "status": 2
    },
    "revenue": {
      "value": 1247.92,
      "compare": 0
    }
  }]
}, {
  name: 'lorem',
  ctr: 12,
  property: {
    value: 1
  },
  status: {
    stage: 1
  }
}, {
  name: 'ipsum'
}]

const iteratees = ['ctr', 'property.value', 'status.stage'];
var searchFor = 'lo';

var result = arr.filter(function(o) {
  return iteratees.some(function(e) {
    var res = e.split('.').reduce(function(a, b) {
      if (a) return a[b];
    }, o);
    if (res) {
      if ((res).toString().indexOf(searchFor) != -1) return true;
    }
  })
})

console.log(result)
&#13;
&#13;
&#13;