从JavaScript中的数组获取不存在的元素

时间:2018-10-24 11:11:52

标签: javascript typescript

我有两个数组

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
    }
}

我相信会有人批准解决这个问题?

6 个答案:

答案 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);
})`