JSON对象如何在Javascript中匹配键值对

时间:2015-07-04 07:45:23

标签: javascript json key-value

我有以下对象:

{ apple: 'banana',
  banana: [ 'pear', 'apple' ],
  melon: 'apple',
  grapes: 'peach',
  carrot: 'apple',
  peach: 'grapes' }

我基本上想找到任何'循环引用',例如:

apple: 'banana',
banana: ['apple']

grapes: 'peach',
peach: 'grapes'

我已经花了很多年的时间并且已经尝试了许多不同的方法,包括将密钥和值复制到一个新的数组中,排序并尝试匹配 - 现在我甚至不确定最好的方法是什么解决这个问题。

修改:感谢大家的帮助。我认为我原来的问题并不是很清楚。我只想确定两个方向都存在参考的情况。所以apple->香蕉,香蕉< -apple和grape->桃子,桃子< -grapes应该匹配。但甜瓜 - >苹果,香蕉 - >苹果和胡萝卜 - >苹果根本不匹配。

我已经使用以下(相当可耻的)代码:

var data = { apple: 'banana',
  banana: ['test', 'apple'],
  melon: 'apple',
  grapes: 'peach',
  carrot: 'apple',
  peach: 'grapes' };

var arr = [], arr2 = [], u = {} 

//Iterate over object 'data' and create an array of arrays - sorted alphabetically
for (var item in data) {
    var val = data[item];
      if (Array.isArray(val)) {
        for (var i = 0; i < val.length; ++i) {
          arr.push(new Array(item, val[i]).sort())
        }
    } else {
      arr.push(new Array(item, val).sort())
    }
}

//Iterate of arr and look for any matches..
for(var i = 0, l = arr.length; i < l; ++i){
  if(u.hasOwnProperty(arr[i])) {
         arr2.push(arr[i]);
      }
      u[arr[i]] = 1;
}

console.log('Matches found: ' + arr2)
//prints: 'Matches found: [ [ 'apple', 'banana' ], [ 'grapes', 'peach' ] ]

3 个答案:

答案 0 :(得分:1)

以下是工作代码段中的一种方法:

&#13;
&#13;
var data = { apple: 'banana',
  banana: [ 'pear', 'apple' ],
  melon: 'apple',
  grapes: 'peach',
  carrot: 'apple',
  peach: 'grapes' };

for (var item in data) {
    var val = data[item];
    if (Array.isArray(val)) {
        for (var i = 0; i < val.length; i++) {
            if (val[i] in data) {
                document.write("circular reference for '" + val[i] + "' in " + item + ":[" + val[i] + "]<br>" );
            }
        }
    } else {
        if (val in data) {
            document.write("circular reference for '" + val + "' in " + item + ":" + val + "<br>");
        }
    }
}
&#13;
&#13;
&#13;

它会生成此输出:

circular reference for 'banana' in apple:banana
circular reference for 'apple' in banana:[apple]
circular reference for 'apple' in melon:apple
circular reference for 'peach' in grapes:peach
circular reference for 'apple' in carrot:apple
circular reference for 'grapes' in peach:grapes

答案 1 :(得分:0)

您只想要直接链接吗?只需检查是否有任何值是键,如果是,则指示是否指向原始键。

 _.mapObject(fruit, function(key, val) {
    if(fruit[val] && (fruit[val] === key || fruit[val].includes(key))){
        console.log(key + ':' + val + ' match!');
    }
 });

你想要任何循环引用吗?你需要一个访问过的&#39;阵列。您实际上是在尝试进行图形遍历,因此您可以查看Dijkstra's等规范示例。

答案 2 :(得分:0)

没有特定语言的方法

保持键/值的多维数组/映射。 (外部数组元素=每个键名,内部数组元素=键的值)

// Psuedo-Code //测试:如果外部数组中的任何元素与内部数组一起存在,则在每个内部键的内部数组中检查// for self

isCircular(JSON Object) {
// Assume No Circular Reference
var isCircular = false;

// Check all the Keys for Circular references
nextKey = firstKey;
while (nextKey != null)
// Setup loop
var parent = nextKey;
var child = null;
   foreach child in parent.values {
       // Check the child.value for parent
       foreach value in child.value {
          // If parent exists, there is a circular reference
          if (value == parent) isCircular = true; // CIRCULAR REFERENCE
       }
   }
nextKey++; // Next Element
}

return isCircular;
}