IndexOf 方法未按预期工作 JAVASCRIPT

IndexOf method not working as expected JAVASCRIPT

nodesData=[
    {name:'name1'},
    {name:'name2'},
    {name:'name1'},
    {name:'name3'},
]

uniqData=[
    {name:'name1'}
    {name:'name2'}
    {name:'name3'}
]

for (let i = 0; i < nodesData.length; i += 2) {
  const currentSource = nodesData[i];
  const currentTarget = nodesData[i + 1];

  const currentData = {
    source: uniqData.indexOf(currentSource),
    target: uniqData.indexOf(currentTarget),
  };
}

所以我有两个包含对象的列表。第一个列表是包含名称的对象列表,其他列表是使用我为删除 duplicates.The 所做的函数生成的列表-1 的源索引...为什么?和其他预期的工作指数。

所以 console.log 将是:

source:-1, target:1

source:0, target:2

数组中的对象具有不同的引用,即使它们看起来相同。基本上:

console.log({name: 'name1'} === {name: 'name1'}); // false

它打印 false 因为比较的对象没有相同的引用,即使它们相似。

因此在您的示例中 indexOf 方法 returns -1 因为对象没有相同的引用(同样即使它们看起来相等)。

因为你不能直接使用 indexOf 你必须先用 find 获取对象的引用然后你可以使用 indexOf,像这样:

const nodesData=[
    {name:'name1'},
    {name:'name2'},
    {name:'name1'},
    {name:'name3'},
]

const uniqData=[
    {name:'name1'},
    {name:'name2'},
    {name:'name3'},
]

for (let i = 0; i < nodesData.length; i += 2) {
  const currentSource = nodesData[i];
  const currentTarget = nodesData[i + 1];

  const currentData = {
    source: uniqData.indexOf(uniqData.find(({name}) => name === currentSource.name)),
    target: uniqData.indexOf(uniqData.find(({name}) => name === currentTarget.name)),
  };
  
  console.log(currentData);
}

注:

我用了destructuring直接得到name属性