我有两个数组
var a = [{'Id': 1, 'name':'bob', 'age':22}, {'Id': 2, 'name':'alice', 'age':12}, {'Id': 3, 'name':'mike', 'age':13}, {'Id': 4, 'name':'prasad', 'age':25}];
var b = [{'Id': 1, 'name':'bob', 'age':22}, {'Id': 2, 'name':'alice', 'age':12}, {'Id': 3, 'name':'mike', 'age':13}];
我想根据ID将数组a的每个元素与数组b进行比较(id始终是唯一的),并且只希望记录数组a中存在的而不是数组b中的记录
此处的预期输出为
{'Id': 4, 'name':'prasad', 'age':25}
到目前为止,我已经尝试过:
for (var elementA of a) {
var uniqueElement = true;
for (var elementB of b) {
//if condition chekcs elementA.Id and elementB.Id
//setting values
}
}
我相信会有人批准解决这个问题?
答案 0 :(得分:1)
尝试以下。为b
数组的 Ids 创建一个 Set ,然后基于此过滤数组a
。
案例1 :如果条目多于1,请使用 Array.filter
var a = [{'Id': 1, 'name':'bob', 'age':22}, {'Id': 2, 'name':'alice', 'age':12}, {'Id': 3, 'name':'mike', 'age':13}, {'Id': 4, 'name':'prasad', 'age':25}];
var b = [{'Id': 1, 'name':'bob', 'age':22}, {'Id': 2, 'name':'alice', 'age':12}, {'Id': 3, 'name':'mike', 'age':13}];
var objB = b.reduce((a,c) => a.add(c.Id), new Set());
var result = a.filter(v => !objB.has(v.Id));
console.log(result);
案例2 :如果有1条条目,请使用 Array.find
var a = [{'Id': 1, 'name':'bob', 'age':22}, {'Id': 2, 'name':'alice', 'age':12}, {'Id': 3, 'name':'mike', 'age':13}, {'Id': 4, 'name':'prasad', 'age':25}];
var b = [{'Id': 1, 'name':'bob', 'age':22}, {'Id': 2, 'name':'alice', 'age':12}, {'Id': 3, 'name':'mike', 'age':13}];
var objB = b.reduce((a,c) => a.add(c.Id), new Set());
var result = a.find(v => !objB.has(v.Id));
console.log(result);
答案 1 :(得分:1)
使用ES6:
const idsFromB = b.map(item => item.Id)
const c = a.filter(item => idsFromB.indexOf(item.Id) < 0)
//outputs [{'Id': 4, 'name':'prasad', 'age':25}]
答案 2 :(得分:0)
var a = [{ 'Id': 1, 'name': 'bob', 'age': 22 }, { 'Id': 2, 'name': 'alice', 'age': 12 }, { 'Id': 3, 'name': 'mike', 'age': 13 }, { 'Id': 4, 'name': 'prasad', 'age': 25 }];
var b = [{ 'Id': 1, 'name': 'bob', 'age': 22 }, { 'Id': 2, 'name': 'alice', 'age': 12 }, { 'Id': 3, 'name': 'mike', 'age': 13 }];
const na = [];
a.filter((_a) => {
let isNotUnique = true;
for (var elementB of b) {
if (_a.Id === elementB.Id) {
isNotUnique = false;
break;
}
}
if (isNotUnique) {
na.push(_a);
}
});
console.log(na);
答案 3 :(得分:0)
这本质上是一个set difference问题。
var a = [
{'Id': 1, 'name':'bob', 'age':22},
{'Id': 2, 'name':'alice', 'age':12},
{'Id': 3, 'name':'mike', 'age':13},
{'Id': 4, 'name':'prasad', 'age':25}
];
var b = [
{'Id': 1, 'name':'bob', 'age':22},
{'Id': 2, 'name':'alice', 'age':12},
{'Id': 3, 'name':'mike', 'age':13}
];
console.log(JSON.stringify(diff(a, b), null, 2));
function diff(a, b) {
return a.filter(x => !b.some(y => deepCompare(x, y)));
}
// https://stackoverflow.com/a/1144249/1762224
function deepCompare(){var t,e,r,n;function o(t,e){var f;if(isNaN(t)&&isNaN(e)&&"number"==typeof t&&"number"==typeof e)return!0;if(t===e)return!0;if("function"==typeof t&&"function"==typeof e||t instanceof Date&&e instanceof Date||t instanceof RegExp&&e instanceof RegExp||t instanceof String&&e instanceof String||t instanceof Number&&e instanceof Number)return t.toString()===e.toString();if(!(t instanceof Object&&e instanceof Object))return!1;if(t.isPrototypeOf(e)||e.isPrototypeOf(t))return!1;if(t.constructor!==e.constructor)return!1;if(t.prototype!==e.prototype)return!1;if(r.indexOf(t)>-1||n.indexOf(e)>-1)return!1;for(f in e){if(e.hasOwnProperty(f)!==t.hasOwnProperty(f))return!1;if(typeof e[f]!=typeof t[f])return!1}for(f in t){if(e.hasOwnProperty(f)!==t.hasOwnProperty(f))return!1;if(typeof e[f]!=typeof t[f])return!1;switch(typeof t[f]){case"object":case"function":if(r.push(t),n.push(e),!o(t[f],e[f]))return!1;r.pop(),n.pop();break;default:if(t[f]!==e[f])return!1}}return!0}if(arguments.length<1)return!0;for(t=1,e=arguments.length;t<e;t++)if(r=[],n=[],!o(arguments[0],arguments[t]))return!1;return!0}
.as-console-wrapper { top: 0; max-height: 100% !important; }
答案 4 :(得分:0)
使用 Array.filter()
过滤第一个数组(如果第二个 Array.some()
有一个元素与第一个数组 Id
)。
arr2.some()
的结果被反转以只包含不在 arr1
中的那些。
let arr1 = [{'Id': 1, 'name':'bob', 'age':22}, {'Id': 2, 'name':'alice', 'age':12}, {'Id': 3, 'name':'mike', 'age':13}, {'Id': 4, 'name':'prasad', 'age':25}];
let arr2 = [{'Id': 1, 'name':'bob', 'age':22}, {'Id': 2, 'name':'alice', 'age':12}, {'Id': 3, 'name':'mike', 'age':13}];
let result = arr1.filter(x=>!arr2.some(y=>x.Id===y.Id));
console.log(result) // output: [{'Id': 4, 'name':'prasad', 'age':25}]
答案 5 :(得分:-1)
var c;
a.forEach((aobj) => {
c = 0;
b.forEach((bobj) => {
if (aobj.Id === bobj.Id) {
c++;
}
})
if (c === 0) console.log(aobj);
})`