检查关联对象中每个键的两个值是否为真

Checking if two values per key are true in an associative object

我有一个对象,写法如下:

var color = "darkred";
var source = "person1"; //this is generated elsewhere and changes
var target = "work23"; //this is generated elsewhere and changes

link = {
              color: color,
              source: source,
              target: target,
              value:1
            }

这个对象被添加到一个数组,links,如下通过一个函数,该函数首先检查它是否已经存在于数组中:

var links = [];
function person_linker(link) {

  for (var key in links) {
    if (links[key].source === link.source && links[key].target === link.target) {
    }
    else
    {
      links.push(link);
    }
  }
}

我 运行 遇到的问题是,它似乎并没有实际执行此检查,只是添加了 link 对象,尽管 links 中有很多键。我读过的所有内容都表明编写 if 语句是进行此类检查的方式,但大多数信息都假定您只在每个键上查找一个值。很明显 && 不是要走的路,但我已经尝试将两者分开,执行 find、indexOf 和 filter 语句,但似乎没有任何效果。代码在技术上是 returns 我想要的,但是因为它允许将多个 link 对象添加到 links 它在进行检查时会占用内存并创建虚假条目 - 使用添加到对象中的数万条额外行的潜力。我在这里做错了什么?我确信这是一个简单的修复,但我终其一生都无法弄清楚 Javascript 想要什么。

您需要使用数组过滤方法。这是我使用 once 检查是否已添加 link 的示例。它还会更有效率,因为它会跳过在 links 数组中找到的 link 之后所有不必要的检查。

在此处查看更多内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some

let color = "darkred";
let source = "person1"; //this is generated elsewhere and changes
let target = "work23"; //this is generated elsewhere and changes

let link = {
  color: color,
  source: source,
  target: target,
  value: 1,
};

const links = [];

function person_linker(link) {
  const linkAlreadyAdded = links.some(presentedLink => {
    return (presentedLink.source === link.source) &&
      (presentedLink.target === link.target)
  });

  if (linkAlreadyAdded) {
    console.log('Check failed.');
  } else {
    console.log('Check passed.');
    links.push(link);
  }
}
console.log(links);
person_linker(link);
console.log(links);
person_linker(link);
console.log(links);