วิธีตรวจสอบว่ามีค่าอยู่ในวัตถุโดยใช้ JavaScript หรือไม่


119

ฉันมีวัตถุใน JavaScript:

var obj = {
   "a": "test1",
   "b": "test2"
}

ฉันจะตรวจสอบว่ามี test1 อยู่ในวัตถุเป็นค่าได้อย่างไร


19
ว้าว.. ใครทำเครื่องหมายว่าซ้ำกันก็บ้าหรืออ่านภาษาอังกฤษไม่ออก อย่างไรก็ตามด้วย es7 คุณจะทำสิ่งที่ชอบ:Object.values(obj).includes('test1');
Mali Naeemi

2
นี่คือรายการที่ไม่ซ้ำกัน (ตรวจสอบรหัส) ที่อ้างถึง: stackoverflow.com/questions/1098040/…
Samuel Åslund

คำตอบ:


132

คุณสามารถเปลี่ยนค่าของออบเจ็กต์ให้เป็นอาร์เรย์และทดสอบว่ามีสตริงอยู่หรือไม่ ถือว่า Object ไม่ได้ซ้อนกันและสตริงตรงกันทั้งหมด:

var obj = { a: 'test1', b: 'test2' };
if (Object.values(obj).indexOf('test1') > -1) {
   console.log('has test1');
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values


8
นี่เป็นส่วนหนึ่งของ Ecma2017 แต่ยังไม่มีให้ใช้งานมากที่สุด :(
Ran Halprin

2
ไม่รองรับ IE 11 และ Edge ควรใช้สำหรับ .. in loop ตามที่อธิบายไว้ด้านล่าง
eugenesqr

26
verbose น้อยลงเล็กน้อย: if(Object.values(obj).includes('test1')) { ... }
nickb

44

คุณสามารถใช้วิธี Array .some:

var exists = Object.keys(obj).some(function(k) {
    return obj[k] === "test1";
});

น้อย verbose ด้วยObject.values: `` var มีอยู่ = Object.values ​​(obj) .some (function (k) {return k === "test1";}); ``
forresto

37

ลอง:

var obj = {
   "a": "test1",
   "b": "test2"
};

Object.keys(obj).forEach(function(key) {
  if (obj[key] == 'test1') {
    alert('exists');
  }
});

หรือ

var obj = {
   "a": "test1",
   "b": "test2"
};

var found = Object.keys(obj).filter(function(key) {
  return obj[key] === 'test1';
});

if (found.length) {
   alert('exists');
}

สิ่งนี้จะใช้ไม่ได้สำหรับNaNและ-0สำหรับค่าเหล่านั้น คุณสามารถใช้ (แทน===) สิ่งใหม่ใน ECMAScript 6:

 Object.is(obj[key], value);

ด้วยเบราว์เซอร์ที่ทันสมัยคุณสามารถใช้:

var obj = {
   "a": "test1",
   "b": "test2"
};

if (Object.values(obj).includes('test1')) {
  alert('exists');
}


27

ES6 ที่สั้นที่สุด + หนึ่งซับ:

let exists = Object.values(obj).includes("test1");

2
โปรดทราบว่า IE ไม่รองรับ .includes () ดังนั้นให้ใช้เฉพาะฝั่งเซิร์ฟเวอร์กับ Node หรือถ้าคุณไม่สนใจ IE
João Pimentel Ferreira

26

ใช้for...inลูป:

for (let k in obj) {
    if (obj[k] === "test1") {
        return true;
    }
}

@ เกรเกอร์ไม่สำคัญว่า 'k' ถูกกำหนดอีกครั้งเมื่อใช้ค่าถัดไป
Vikrant

4
คำตอบที่ประเมินต่ำมากประสิทธิภาพของวิธีนี้ดีกว่าวิธีอื่น ๆ
PirateApp

20

คุณสามารถใช้Object.values ​​() :

Object.values()วิธีการส่งกลับอาร์เรย์ของตัวเองค่าทรัพย์สินนับเป็นวัตถุที่กำหนดให้ในลำดับเช่นเดียวกับที่ให้บริการโดย for...inวง (ความแตกต่างที่ว่าสำหรับในห่วงระบุคุณสมบัติในห่วงโซ่ต้นแบบเช่นกัน)

จากนั้นใช้วิธีindexOf () :

indexOf()วิธีการส่งกลับดัชนีแรกที่เป็นองค์ประกอบที่กำหนดสามารถพบได้ในอาร์เรย์หรือ -1 ถ้ามันไม่เป็นปัจจุบัน

ตัวอย่างเช่น:

Object.values(obj).indexOf("test`") >= 0

ตัวอย่างรายละเอียดเพิ่มเติมอยู่ด้านล่าง:

var obj = {
  "a": "test1",
  "b": "test2"
}


console.log(Object.values(obj).indexOf("test1")); // 0
console.log(Object.values(obj).indexOf("test2")); // 1

console.log(Object.values(obj).indexOf("test1") >= 0); // true
console.log(Object.values(obj).indexOf("test2") >= 0); // true 

console.log(Object.values(obj).indexOf("test10")); // -1
console.log(Object.values(obj).indexOf("test10") >= 0); // false


9

ผมได้ทดสอบกับตัวอย่างทั้งหมดเหล่านี้และฉันวิ่งในNode.js v8.11.2 ใช้เป็นแนวทางในการเลือกทางเลือกที่ดีที่สุดของคุณ

let i, tt;
    const obj = { a: 'test1', b: 'test2', c: 'test3', d: 'test4', e: 'test5', f: 'test6' };

console.time("test1")
i = 0;
for( ; i<1000000; i=i+1) {
  if (Object.values(obj).indexOf('test4') > -1) {
    tt = true;
  }
}
console.timeEnd("test1")

console.time("test1.1")
i = 0;
for( ; i<1000000 ; i=i+1) {
  if (~Object.values(obj).indexOf('test4')) {
    tt = true;
  }
}
console.timeEnd("test1.1")

console.time("test2")
i = 0;
for( ; i<1000000; i=i+1) {
  if (Object.values(obj).includes('test4')) {
    tt = true;
  }
}
console.timeEnd("test2")


console.time("test3")
i = 0;
for( ; i<1000000 ; i=i+1) {
  for(const item in obj) {
    if(obj[item] == 'test4') {
      tt = true;
      break;
    }
  }
}
console.timeEnd("test3")

console.time("test3.1")
i = 0;
for( ; i<1000000; i=i+1) {
  for(const [item, value] in obj) {
    if(value == 'test4') {
      tt = true;
      break;
    }
  }
}
console.timeEnd("test3.1")


console.time("test4")
i = 0;
for( ; i<1000000; i=i+1) {
  tt = Object.values(obj).some((val, val2) => {
    return val == "test4"
  });
}
console.timeEnd("test4")

console.time("test5")
i = 0;
for( ; i<1000000; i=i+1) {
  const arr = Object.keys(obj);
  const len = arr.length;
  let i2 = 0;
  for( ; i2<len ; i2=i2+1) {
    if(obj[arr[i2]] == "test4") {
      tt = true;
      break;
    }
  }
}
console.timeEnd("test5")

ผลลัพธ์บนเซิร์ฟเวอร์ของฉัน

test1:   272.325 ms
test1.1: 246.316 ms
test2:   251.98 0ms
test3:    73.284 ms
test3.1: 102.029 ms
test4:   339.299 ms
test5:    85.527 ms


2

คุณสามารถลองสิ่งนี้:

function checkIfExistingValue(obj, key, value) {
    return obj.hasOwnProperty(key) && obj[key] === value;
}
var test = [{name : "jack", sex: F}, {name: "joe", sex: M}]
console.log(test.some(function(person) { return checkIfExistingValue(person, "name", "jack"); }));

0
getValue = function (object, key) {
    return key.split(".").reduce(function (obj, val) {
        return (typeof obj == "undefined" || obj === null || obj === "") ? obj : (_.isString(obj[val]) ? obj[val].trim() : obj[val]);}, object);
};

var obj = {
   "a": "test1",
   "b": "test2"
};

เรียกว่าฟังก์ชัน:

 getValue(obj, "a");

คุณใช้ไลบรารีอื่น ๆ เมื่อใช้โซลูชันนี้หรือไม่?
Sherwin Ablaña Dapito

0
var obj = {"a": "test1", "b": "test2"};
var getValuesOfObject = Object.values(obj)
for(index = 0; index < getValuesOfObject.length; index++){
    return Boolean(getValuesOfObject[index] === "test1")
}

เมธอด Object.values ​​() ส่งคืนอาร์เรย์ (กำหนดให้กับ getValuesOfObject) ที่มีค่าคุณสมบัติที่นับได้ของอ็อบเจ็กต์ (obj) ที่ระบุ อาร์เรย์ถูกทำซ้ำโดยใช้forลูปเพื่อดึงแต่ละค่า (ค่าใน getValuesfromObject) และส่งคืนฟังก์ชันบูลีน () เพื่อดูว่านิพจน์ ("text1" เป็นค่าในอาร์เรย์แบบวนซ้ำ) เป็นจริงหรือไม่


0

คุณสามารถลองอันนี้

var obj = {
  "a": "test1",
  "b": "test2"
};

const findSpecificStr = (obj, str) => {
  return Object.values(obj).includes(str);
}

findSpecificStr(obj, 'test1');


-5

คำตอบง่ายๆสำหรับสิ่งนี้มีให้ด้านล่าง

สิ่งนี้ใช้งานได้เนื่องจาก JavaScript ทุกประเภทมีคุณสมบัติ“ ตัวสร้าง”อยู่บนต้นแบบ

let array = []
array.constructor === Array
// => true


let data = {}
data.constructor === Object
// => true

4
โปรดเพิ่มรหัสของคุณในคำตอบของคุณเป็นข้อความไม่ใช่รูปภาพดูฉันจะจัดรูปแบบโพสต์ของฉันโดยใช้ Markdown หรือ HTML ได้อย่างไร
Vasil Velichkov

โปรดถอดรหัสในภาพเป็นข้อความ ขอบคุณล่วงหน้า.
Peter Mortensen

-7

นี่ควรเป็นการตรวจสอบง่ายๆ

ตัวอย่าง 1

var myObj = {"a": "test1"}

if(myObj.a == "test1") {
    alert("test1 exists!");
}

1
ตรวจสอบว่าคีย์ไม่ใช่ค่า
jcubic

1
สิ่งนี้จะเคลื่อนผ่านโซ่ต้นแบบและอาจทำงานได้ตามที่คาดไว้ตัวอย่างเช่นvar a = {};<br/>'hasOwnProperty' in a' //true
Noctisdark
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.