繁体   English   中英

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

[英]JSON object how to match key to value pairs in Javascript

我有以下对象:

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

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

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

grapes: 'peach',
peach: 'grapes'

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

编辑:感谢大家的帮助。 我认为我最初的问题不太清楚。 我只想确定两个方向都存在参考的情况。 所以apple->banana,banana<-apple 和grass->peach,peach<-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' ] ]

这是工作片段中的一种方法:

 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>"); } } }

它生成此输出:

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

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

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

你想要任何循环引用吗? 您需要一个“已访问”数组。 您本质上是在尝试进行图遍历,以便您可以查看Dijkstra 之规范示例。

无语言特定方法

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

// 伪代码 // 测试:如果外部数组中的任何元素与内部数组存在,则检查 // 每个内部键的内部数组中的 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM