通过多个键获取数组项

时间:2017-11-06 11:14:41

标签: typescript

我需要制作一个简单的通用过滤器功能,以便对javascript事件进行“更改”搜索。

我有以下Json:

{
    "name": "Ramsey Cummings",
    "gender": "male",
    "age": 12.5,
    "address": {
        "state": {
            "post": "20042",
            "name": "South Carolina"
        },
        "city": "Glendale"
    }
}

如何制作通用方法以在我的对象中搜索所有叶子?

我添加了一个用户映射,我将传递给我的函数,例如:

this.filterDataMap = [
  {
    key: 'address', value: 'state.name'
  }
]

我的过滤功能如下:

filterTable(array, value) {
let hash = [];
let objectProperties = Object.getOwnPropertyNames(array[0]);

$.grep(array, (item, i) => {
  let isValidItem = false;
  objectProperties.forEach(element => {
    let mapElementArray = $.grep(this.filterDataMap, i => i.key === element);
    if (mapElementArray.length > 0) {
      debugger;
      let mapperValue = ''.concat(element, '.', mapElementArray[0].value);
      if (item[mapperValue] !== undefined &&
        item[mapperValue].toString().toLowerCase().indexOf(value) !== -1 || !value)
        isValidItem = true;
    }
    else if (item[element] !== undefined && item[element].toString().toLowerCase().indexOf(value) !== -1 || !value)
      isValidItem = true;
  });
  if (isValidItem)
    hash.push(item);
})

return hash;

}

我在这里的另一篇文章中发现,应该可以连接我的对象属性,如item ['address.state.name']但是当我这样做时,我得到了未定义的结果。

1 个答案:

答案 0 :(得分:0)

我发现这是针对我的情况的 https://github.com/mariocasciaro/object-path

我的更新代码现在看起来像这样

filterTable(array, value) {
let hash = [];
let objectProperties = Object.getOwnPropertyNames(array[0]);

$.grep(array, (item, i) => {
  let isValidItem = false;
  objectProperties.forEach(element => {
    let mapElementArray = $.grep(this.filterDataMap, i => i.key === element);
    if (mapElementArray.length > 0) {
      var objectPath = require("object-path");
      let mapperValue = ''.concat(element, '.', mapElementArray[0].value);
      if (objectPath.get(item, mapperValue) !== undefined &&
      objectPath.get(item, mapperValue).toString().toLowerCase().indexOf(value) !== -1 || !value)
        isValidItem = true;
    }
    else if (item[element] !== undefined && item[element].toString().toLowerCase().indexOf(value) !== -1 || !value)
      isValidItem = true;
  });
  if (isValidItem)
    hash.push(item);
})

return hash;

}