在javascript / jQuery中对关联数组执行“Diff”操作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在javascript / jQuery中对关联数组执行“Diff”操作?相关的知识,希望对你有一定的参考价值。
如果我有两个关联数组,那么对它们的值进行差异的最有效方法是什么?
例如,给定:
array1 = {
foreground: 'red',
shape: 'circle',
background: 'yellow'
};
array2 = {
foreground: 'red',
shape: 'square',
angle: '90',
background: 'yellow'
};
我如何检查另一个,以便缺少或附加的项目是结果数组。在这种情况下,如果我想比较array2中的array1,它将返回:
array3 = {shape: 'circle'}
虽然如果我在array1中比较array2,它将返回:
array3 = {shape: 'square', angle: '90'}
在此先感谢您的帮助!
试试这个:
function diff(obj1, obj2) {
var result = {};
$.each(obj1, function (key, value) {
if (!obj2.hasOwnProperty(key) || obj2[key] !== obj1[key]) {
result[key] = value;
}
});
return result;
}
如果您熟悉php语法,请查看http://phpjs.org/functions/index,其中包含几乎所有PHP的数组相关函数都转换为javascript - 包括array_diff
RaYell的解决方案很不错,但不幸的是只会告诉你obj2中与obj1不同或不存在的项目,如果我们需要知道双方,让我们获取所有密钥然后进行比较。以下函数将返回一个关联数组,其中包含每个对象的键值。哦......公平地说,我还没有测试过,但这应该有效。
var diff = function(obj1,obj2) {
var newObj = $.extend({},obj1,obj2);
var result = {};
$.each(newObj, function (key, value) {
if (!obj2.hasOwnProperty(key) || !obj1.hasOwnProperty(key) || obj2[key] !== obj1[key]) {
result[key] = [obj1[key],obj2[key]];
}
});
return result;
}
哦,虽然我确实认识到第一个解决方案回答了最初的问题,但我认为上述解决方案提供了另一种方法,初始用户可能觉得有用,因此不需要检查两次。
这可能比你需要的要复杂得多,但是你可以尝试我的jsondiffpatch lib来扩展任何一对javascript对象:
https://github.com/benjamine/jsondiffpatch
如果你想测试它,你可以看到它生活在http://benjamine.github.com/jsondiffpatch/demo/index.html
我是这样的:
function diff(obj1, obj2){
var result = {};
for(var key1 in obj1){
let resposta = {
before : obj1[key1] ? obj1[key1] : '',
after : obj2[key1] ? obj2[key1] : ''
};
if(resposta.before !== resposta.after){
result[key1] = resposta;
}
}
for(var key2 in obj2){
if(!(key2 in result) || (key2 in obj1)){
let resposta = {
before : obj1[key2] ? obj1[key2] : '',
after : obj2[key2] ? obj2[key2] : ''
}
if(resposta.before !== resposta.after){
result[key2] = resposta;
}
}
}
return (Object.assign({}, result));
}
以上是关于在javascript / jQuery中对关联数组执行“Diff”操作?的主要内容,如果未能解决你的问题,请参考以下文章