我有以下对象:
{ 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' ] ]
答案 0 :(得分:1)
以下是工作代码段中的一种方法:
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;
它会生成此输出:
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;
}