使用Javascript从JSON过滤唯一对

时间:2015-10-19 22:21:29

标签: javascript arrays json

我有一个对象数组,每个对象都有一个左右元素。在某些情况下,在数组内,左边可能等于右边,反之亦然,对于阵列中的不同对象。这些“重复”需要删除。

例如,我有一个像这样的对象数组......

[
    {"left":"cow","right":"pig"},
    {"left":"horse","right":"pig"},
    {"left":"rabbit","right":"pig"},
    {"left":"bird","right":"pig"},
    {"left":"bear","right":"pig"},
    {"left":"cow","right":"bird"},
    {"left":"horse","right":"bird"},
    {"left":"pig","right":"bird"},
    {"left":"cow","right":"horse"},
    {"left":"bird","right":"horse"},
    {"left":"pig","right":"horse"},
    {"left":"rabbit","right":"horse"},
    {"left":"horse","right":"cow"},
    {"left":"pig","right":"cow"},
    {"left":"bird","right":"cow"},
    {"left":"bear","right":"cow"},
    {"left":"horse","right":"rabbit"},
    {"left":"pig","right":"rabbit"},
    {"left":"bear","right":"rabbit"},
    {"left":"pig","right":"bear"},
    {"left":"rabbit","right":"bear"},
    {"left":"cow","right":"bear"}
]

我需要将其过滤到唯一的对,就像这样......

[
    {"left":"cow","right":"pig"},
    {"left":"horse","right":"pig"},
    {"left":"rabbit","right":"pig"},
    {"left":"bird","right":"pig"},
    {"left":"bear","right":"pig"},
    {"left":"cow","right":"bird"},
    {"left":"horse","right":"bird"},
    {"left":"cow","right":"horse"},
    {"left":"rabbit","right":"horse"},
    {"left":"bear","right":"cow"},
    {"left":"bear","right":"rabbit"}
]

使用javascript。

3 个答案:

答案 0 :(得分:3)

您将需要使用Array.prototype.filter,以及一个基本对象来跟踪触摸的对。

var input = [ ... ];
var pairs = {};
var output = input
    .filter(function(item) {
        if (pairs[item.left] == item.right ||
            pairs[item.right] == item.left)
            return false;
        pairs[item.left] = item.right;
        return true;
    });

答案 1 :(得分:0)

嗯,跟踪项目的最简单方法是创建地图。我们会把它视为一套。我们将简单地对左右项进行排序,对它们进行哈希处理,然后通过为键分配值true将计算出的哈希值存储到地图中。当我们稍后到达相同的哈希时,我们将知道我们已经标记了该对。副本将被过滤掉。

我从用户hashing logic借用了下面的LordVlad。您可以提供自己的散列方法。



document.body.innerHTML = printItems(pruneItems(getItems()));

function pruneItems(items) {
  var hashes = {};

  return items.filter(function(item, idx, arr) {
    var hash = hashStr([item.left, item.right].sort().join(''));

    if (hashes[hash] !== true) {
      return (hashes[hash] = true);
    }

    return false
  }, []);
}

function hashStr(str) {
  return str.split('').reduce(function(res, ch) {
    res = ((res << 5) - res) + ch.charCodeAt(0);
    return res & res
  }, 0);
}

function printItems(items) {
  return '[\n' + items.map(function(item) {
    return '\t' + JSON.stringify(item).replace(/([,])/g, '$1 ');
  }).join('\n') + '\n]\n';
}

function getItems() {
  return [
    { "left": "cow",    "right": "pig"    },
    { "left": "horse",  "right": "pig"    },
    { "left": "rabbit", "right": "pig"    },
    { "left": "bird",   "right": "pig"    },
    { "left": "bear",   "right": "pig"    },
    { "left": "cow",    "right": "bird"   },
    { "left": "horse",  "right": "bird"   },
    { "left": "pig",    "right": "bird"   },
    { "left": "cow",    "right": "horse"  },
    { "left": "bird",   "right": "horse"  },
    { "left": "pig",    "right": "horse"  },
    { "left": "rabbit", "right": "horse"  },
    { "left": "horse",  "right": "cow"    },
    { "left": "pig",    "right": "cow"    },
    { "left": "bird",   "right": "cow"    },
    { "left": "bear",   "right": "cow"    },
    { "left": "horse",  "right": "rabbit" },
    { "left": "pig",    "right": "rabbit" },
    { "left": "bear",   "right": "rabbit" },
    { "left": "pig",    "right": "bear"   },
    { "left": "rabbit", "right": "bear"   },
    { "left": "cow",    "right": "bear"   }
  ];
}
&#13;
body {
  font-family: monospace;
  white-space: pre;
}
&#13;
&#13;
&#13;

结果

[
    {"left":"cow", "right":"pig"}
    {"left":"horse", "right":"pig"}
    {"left":"rabbit", "right":"pig"}
    {"left":"bird", "right":"pig"}
    {"left":"bear", "right":"pig"}
    {"left":"cow", "right":"bird"}
    {"left":"horse", "right":"bird"}
    {"left":"cow", "right":"horse"}
    {"left":"rabbit", "right":"horse"}
    {"left":"bear", "right":"cow"}
    {"left":"bear", "right":"rabbit"}
]

答案 2 :(得分:0)

尝试使用Array.prototype.forEach()Array.prototype.some()RegExp.prototype.test()

var res = [];
arr.forEach(function(val, key) {  
    var re = new RegExp(val.left + "|" + val.right);
    if (!res.some(function(v, k) {
      return re.test(v.left) && re.test(v.right)
    })) {
      res.push(val)
    }
});

var arr = [{
  "left": "cow",
  "right": "pig"
}, {
  "left": "horse",
  "right": "pig"
}, {
  "left": "rabbit",
  "right": "pig"
}, {
  "left": "bird",
  "right": "pig"
}, {
  "left": "bear",
  "right": "pig"
}, {
  "left": "cow",
  "right": "bird"
}, {
  "left": "horse",
  "right": "bird"
}, {
  "left": "pig",
  "right": "bird"
}, {
  "left": "cow",
  "right": "horse"
}, {
  "left": "bird",
  "right": "horse"
}, {
  "left": "pig",
  "right": "horse"
}, {
  "left": "rabbit",
  "right": "horse"
}, {
  "left": "horse",
  "right": "cow"
}, {
  "left": "pig",
  "right": "cow"
}, {
  "left": "bird",
  "right": "cow"
}, {
  "left": "bear",
  "right": "cow"
}, {
  "left": "horse",
  "right": "rabbit"
}, {
  "left": "pig",
  "right": "rabbit"
}, {
  "left": "bear",
  "right": "rabbit"
}, {
  "left": "pig",
  "right": "bear"
}, {
  "left": "rabbit",
  "right": "bear"
}, {
  "left": "cow",
  "right": "bear"
}];

var res = [];
arr.forEach(function(val, key) {  
    var re = new RegExp(val.left + "|" + val.right);
    if (!res.some(function(v, k) {
      return re.test(v.left) && re.test(v.right)
    })) {
      res.push(val)
    }
});

console.log(arr, JSON.stringify(arr, null, 2)
            , res, JSON.stringify(res, null, 2));

document.querySelector("pre").textContent = JSON.stringify(res, null, 2)
<pre></pre>