javascript - 针对另外两个对象数组过滤一个对象数组时出现意外结果

标签 javascript arrays object

我试图从数组“a”中过滤出与数组“b”和“c”中的对象匹配的对象。这是jsfiddle的链接测试代码。

这是我目前拥有的:

const a = [{
  "name": "sondre",
  "uq_id": "abc1"
}, {
  "name": "sofie",
  "uq_id": "abc2"
}, {
  "name": "casper",
  "uq_id": "abc3"
}, {
  "name": "odin",
  "uq_id": "abc4"
}];

const b = [{
  "name": "sondre",
  "uq_id": "abc1"
}, {
  "name": "odin",
  "uq_id": "abc4"
}];

const c = [{
  "name": "casper",
  "uq_id": "abc3"
}];

function sort(a, b, c) {
  result = [];
  console.log(result);
  if (b !== null) {
    result = a.filter(function(item) {
      return !b.includes(item.uq_id);
    })
  }
  if (c !== null) {
    result = result.filter(function(item) {
      return !c.includes(item.uq_id);
    })
  }
  console.log(result);
}

sort(a, b, c);

我希望得到以下输出:

[{name="sofie", uq_id="abc2"}]

但出于某种原因它输出:

[{name="sondre", uq_id="abc1"},
{name="sofie", uq_id="abc2"},
{name="casper", uq_id="abc3"},
{name="odin", uq_id="abc4"}]

有谁知道我怎样才能让它按我的预期工作?

最佳答案

如果目标是过滤掉 anamebc 中的条目相匹配的条目>,您不能使用 includes,除非 abc 中的条目引用 < strong>相同对象(不仅仅是等同的对象)。

假设它们不存在,您可以使用 some 来查明数组是否包含与 name 匹配的项。您需要使用 && 来查看 bc 中没有匹配项:

const filtered = a.filter(entry => {
    return !b.some(({name}) => entry.name === name) &&
           !c.some(({name}) => entry.name === name);
});

实时复制:

const a = [{
  "name": "sondre",
  "uq_id": "abc1"
}, {
  "name": "sofie",
  "uq_id": "abc2"
}, {
  "name": "casper",
  "uq_id": "abc3"
}, {
  "name": "odin",
  "uq_id": "abc4"
}];

const b = [{
  "name": "sondre",
  "uq_id": "abc1"
}, {
  "name": "odin",
  "uq_id": "abc4"
}];

const c = [{
  "name": "casper",
  "uq_id": "abc3"
}];

function filter(a, b, c) {
    const filtered = a.filter(entry => {
        return !b.some(({name}) => entry.name === name) &&
               !c.some(({name}) => entry.name === name);
    });
    return filtered;
}

console.log(filter(a, b, c));

也可以用 every 来表示,看你喜欢哪个:

const filtered = a.filter(entry => {
    return b.every(({name}) => entry.name !== name) &&
           c.every(({name}) => entry.name !== name);
});

如果 bc 真的很大(数十万个条目,也许数百万个)可能效率低到足以证明创建 首先设置名称:

const names = new Set([
  ...b.map(({name}) => name),
  ...c.map(({name}) => name)
]);
const filtered = a.filter(entry => {
    return !names.has(entry.name);
});

或者您可能只是出于偏好或清晰度而这样做。

实时复制:

const a = [{
  "name": "sondre",
  "uq_id": "abc1"
}, {
  "name": "sofie",
  "uq_id": "abc2"
}, {
  "name": "casper",
  "uq_id": "abc3"
}, {
  "name": "odin",
  "uq_id": "abc4"
}];

const b = [{
  "name": "sondre",
  "uq_id": "abc1"
}, {
  "name": "odin",
  "uq_id": "abc4"
}];

const c = [{
  "name": "casper",
  "uq_id": "abc3"
}];

function filter(a, b, c) {
    const names = new Set([
      ...b.map(({name}) => name),
      ...c.map(({name}) => name)
    ]);
    const filtered = a.filter(entry => {
        return !names.has(entry.name);
    });
    return filtered;
}

console.log(filter(a, b, c));

关于javascript - 针对另外两个对象数组过滤一个对象数组时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56933353/

相关文章:

C# 长度为 1 的数组与单值、性能和内存开销

具有函数属性的 Javascript 对象有关 'this' 的详细信息

Python通过ref访问一个对象/需要打标签

javascript - 在重新声明未定义之前立即记录函数 block 内的全局变量 : Should not it take the Global Variable Value?

java - 添加新项目时如何启动计数器

javascript - 如何查询具有特定引用类型的 firebase 项目

javascript - 如何用 JSON 数组中的值替换现有键?

java - 得到奇怪的输出,如 "Values@7d5b6e"而不是某些特定的字符串

javascript - Bootstrap scrollspy 未检测到 home

javascript - 使用 ES6 代理替换原型(prototype)时超出最大调用堆栈大小