2017-02-27 90 views
-1

如何根据JSON/JavaScript Array或Object的值(或它们的父值)满足逻辑条件?筛选和搜索符合复杂条件的对象/数组项目

什么我想(定义magicalWay功能!):

myArray = [ 
      {"type":"A","items":[0,1,2,3,4]}, 
      {"type":"B","items":['x','y','z']} 
      ]; 

magicalWay(myArray,"<parent>.type=='A'","<this>.items"); 
//and output: [0,1,2,3,4] 

magicalWay(myArray,"true","<this>.items"); 
//and output: [[0,1,2,3,4],['x','y','z']] 

myObject = { 
    "type": "A", 
    "items": [ 
    { 
     "type": "B", 
     "items": ['x','y'] 
    }, 
    { 
     "type": "C", 
     "items": [0,1] 
    } 
    ] 
}; 

magicalWay(myObject,"true","<this>.items[*].items"); 
//and output: [['x','y'],[0,1]] 

任何建议,帮助我:)

我觉得我magicalWay功能必须使用array.prototype.filter一些如何:

function magicalWay(myVar,strCondition,strPattern){ 
    //replacing strCondition groups like [*] and others, and evaluate strCondition for each searching items. 
    //strPattern is which path should be extract and search 
    //and myVar is which searching through! 
} 

附加:就像MySQL JSON提取''[*]。items'ret将所有项目的items值都放在一个数组中!

+1

'true'对于'magicicalWay()'的第二次调用意味着什么。您需要添加更多关于您想要实现的细节。 –

+0

评估路径模式中的每个项目的“真”意味着它们都可以接受@AmreshVenugopal – MohaMad

+0

所以根据我的理解,您想要基于第二个参数的数组或对象内的项目的值? –

回答

2

的第一步是定义实际功能你会用它来得到你想要的结果:

var myArray = [ 
 
    { 
 
    "type": "A", 
 
    "items": [0, 1, 2, 3, 4] 
 
    }, 
 
    { 
 
    "type": "B", 
 
    "items": ['x', 'y', 'z'] 
 
    } 
 
]; 
 

 
var result1 = myArray 
 
    .filter(obj => obj.type === "A")   // Select 
 
    .map(obj => obj.items)      // Get nested 
 
    .reduce((arr, cur) => arr.concat(cur), []); // Flatten 
 

 
//[0,1,2,3,4] 
 
console.log(JSON.stringify(result1));

你需要为你的object做同样的输入。一旦你已经找到了如何filtermapreduce工作,你可以用这个签名创建一个函数:

function getData(source, itemFilter, propertyGetter) { /* ... */ } 

现在,如果它开始与基于字符串过滤器定义的要求,你必须解析字符串并返回实际的功能。我想你提出串逻辑是有点危险,很难分析,但如果你写严格的检测手段,你可能会摆脱它......一个起点可以是:

const noFilter =() => true; 
 

 
function getFilterMethod(str) { 
 
    if (str === "true") { 
 
    return noFilter; 
 
    } 
 
    
 
    const parts = str.split(".").slice(1); 
 
    
 
    return (
 
    obj => parts.reduce((cur, key) => cur[key], obj) 
 
); 
 
} 
 

 
const data = [ 
 
    { items: true }, 
 
    { items: false }, 
 
    { test: 1 } 
 
]; 
 

 
console.log("true:", 
 
    JSON.stringify(data.filter(getFilterMethod("true"))) 
 
); 
 

 

 
console.log("<this>.items:", 
 
    JSON.stringify(data.filter(getFilterMethod("<this>.items"))) 
 
);

二者结合起来,添加数据拼命三郎的逻辑,和你对像移动:

magicalWay(
    myArray, getFilterMethod("true"), getPropertyExtractor("<this>.items") 
) 

我不会为你写的代码的其余部分,但如果你有具体的问题我我很乐意帮忙!

+0

谢谢你的好回答。如果我有严重的问题,我会再问一次:D @ user3297191 – MohaMad