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
属性
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
属性