json 在对象数组中查找任何匹配项

yhxst69z  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(220)

我在Javascript中有一个对象数组,我需要检查值是否在该对象中以返回id。我使用的是some()函数,但它仅在与第一个对象匹配时有效
这是一个数组:

const testObj = [
  {id: 1, nombre: "Juan"},
  {id: 2, nombre: "María"},
  {id: 3, nombre: "Pedro"}
];

我是这么做的:

let test = 'María'

let priority;

testObj.some(item => item.nombre === test ? priority = item.id : priority = 7)

下面是它返回的内容:

console.log(priority) // 7

如果在一个对象中找到值,为什么它不返回正确的id?

rks48beu

rks48beu1#

回调函数一返回trueArray.some()方法就结束。(如7)等效于true,当priortiy为7时,some结束。Array.some()用于查找是否至少有一个项目与条件匹配,其结果为布尔值(如果至少有一个匹配,则为true;如果没有,则为false)。不要将其用作简单的循环,或用于查找特定的项目。
使用Array.find()代替。如果找到了项,则将其反结构化为id并赋值给priority。如果Array.find()找不到项,则返回null。我们可以使用Nullish coalescing operator (??)提供一个默认值为7的回退对象。

const testObj = [
  {id: 1, nombre: "Juan"},
  {id: 2, nombre: "María"},
  {id: 3, nombre: "Pedro"}
];

const test = 'María'

// using destructuring
const { id: priority } = testObj.find(o => o.nombre === test) ?? { id: 7 }
console.log(priority)

// using a ternary
const item = testObj.find(o => o.nombre === test)
const priority2 = item ? item.id : 7
console.log(priority2)

// using optional chaining
const priority3 = testObj.find(o => o.nombre === test)?.id ?? 7;
console.log(priority3)
2q5ifsrm

2q5ifsrm2#

问题
您在三元运算符的else条件中将priority的值设置为7,无论是否找到该值,该运算符都将始终执行。

解决方案:

您可以修改代码,以便仅当在数组中找到优先级值时才设置该值。

let test = 'María';
let priority = null;
const testObj = [ {id: 1, nombre: "Juan"}, {id: 2, nombre: "María"}, {id: 3, nombre: "Pedro"} ];

testObj.some(item => {
  if (item.nombre === test) {
    priority = item.id;
    return true;
  }
});

console.log(priority); // 2

使用for..of循环:

let test = 'María';
let priority = 7;

for (const item of testObj) {
  if (item.nombre === test) {
    priority = item.id;
    break;
  }
}

console.log(priority); // 2

使用find()方法:

let test = 'María';
let priority = testObj.find(item => item.nombre === test)?.id || 7;

console.log(priority); // 2
  • 注意:使用find()或简单的for..of循环(带有早期中断语句)可能比使用some更好。*

相关问题