Cách kiểm tra xem một giá trị có tồn tại trong một đối tượng bằng JavaScript hay không


102

Tôi có một đối tượng trong JavaScript:

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

Làm cách nào để kiểm tra rằng test1 tồn tại trong đối tượng dưới dạng một giá trị?


16
Wow..những người đánh dấu nó là trùng lặp hoặc là điên hoặc không biết cách đọc tiếng Anh. Dù sao, với ES7, bạn làm như sau:Object.values(obj).includes('test1');
Mali Naeemi

2
Đây không phải là bản sao (kiểm tra khóa) được tham chiếu đến: stackoverflow.com/questions/1098040/…
Samuel Åslund

Câu trả lời:


125

Bạn có thể biến các giá trị của một Đối tượng thành một mảng và kiểm tra xem một chuỗi có tồn tại hay không. Nó giả định rằng Đối tượng không được lồng vào nhau và chuỗi là một đối sánh chính xác:

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
Đây là một phần của Ecma2017, nó chưa có sẵn cho hầu hết sử dụng :(
Ran Halprin

2
Không được hỗ trợ trong IE 11 và Edge, nó tốt hơn để sử dụng for..in vòng lặp như mô tả dưới đây
eugenesqr

24
Ít dài dòng hơn một chút: if(Object.values(obj).includes('test1')) { ... }
nickb

40

Bạn có thể sử dụng phương thức Array .some:

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

35

Thử:

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

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

Hoặc là

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

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

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

Điều này sẽ không hoạt động cho NaN-0cho các giá trị đó. Bạn có thể sử dụng (thay vì ===) những gì mới trong ECMAScript 6:

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

Với các trình duyệt hiện đại, bạn cũng có thể sử dụng:

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

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


24

Sử dụng một for...invòng lặp:

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

@Gregor không quan trọng vì 'k' được định nghĩa lại khi nó nhận giá trị tiếp theo.
Vikrant

4
Câu trả lời rất đánh giá thấp, hiệu suất trên một này s tốt hơn so với bất kỳ phương pháp khác
PirateApp

2
Đồng ý với điều đó. câu trả lời được đánh giá rất thấp ...
Samakaab

22

ES6 ngắn nhất + một lớp lót:

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

1
Xin lưu ý rằng IE không hỗ trợ .includes (), vì vậy hãy chỉ sử dụng nó ở phía máy chủ với Node hoặc nếu bạn chỉ đơn giản là không quan tâm đến IE.
João Pimentel Ferreira

19

Bạn có thể sử dụng Object.values ​​() :

Các Object.values()phương thức trả về một mảng các giá trị tài sản đếm được riêng một đối tượng nhất định, trong thứ tự như được cung cấp bởi một for...invòng lặp (sự khác biệt là có một cho-in liệt kê vòng lặp tính trong chuỗi ban đầu cũng).

và sau đó sử dụng phương thức indexOf () :

Các indexOf()phương thức trả về chỉ số đầu tiên mà tại đó một yếu tố nhất định có thể được tìm thấy trong mảng, hoặc -1 nếu nó không phải là hiện tại.

Ví dụ:

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

Dưới đây là một ví dụ chi tiết hơn:

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


8

Tôi đã thực hiện một bài kiểm tra với tất cả các ví dụ này và tôi đã chạy nó trong Node.js v8.11.2 . Hãy xem đây là hướng dẫn để chọn ra sự lựa chọn tốt nhất của bạn.

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")

Đầu ra trên máy chủ của tôi

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

6

Đối với một lớp lót, tôi sẽ nói:

exist = Object.values(obj).includes("test1");
console.log(exist);

2

Bạn có thể thử điều này:

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

bạn có thể thử cái này

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

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

findSpecificStr(obj, 'test1');

-1
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"
};

Hàm được gọi là:

 getValue(obj, "a");

Bạn có sử dụng các thư viện khác khi triển khai giải pháp này không?
Sherwin Ablaña Dapito

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

Phương thức Object.values ​​() trả về một mảng (được gán cho getValuesOfObject) chứa các giá trị thuộc tính có thể liệt kê của đối tượng đã cho (obj). Mảng đã được lặp lại bằng cách sử dụng forvòng lặp để truy xuất từng giá trị (các giá trị trong getValuesfromObject) và trả về một hàm Boolean () để tìm hiểu xem biểu thức ("text1" có phải là một giá trị trong mảng lặp) không.



-4

Câu trả lời đơn giản cho điều này được đưa ra dưới đây.

Điều này đang hoạt động vì mọi loại JavaScript đều có thuộc tính “constructor” trên nguyên mẫu của nó ”.

Nhập mô tả hình ảnh tại đây

Nhập mô tả hình ảnh tại đây


4
Vui lòng thêm mã vào câu trả lời của bạn dưới dạng văn bản chứ không phải hình ảnh, xem thêm Làm cách nào để định dạng bài đăng của tôi bằng Markdown hoặc HTML?
Vasil Velichkov

Vui lòng chuyển mã trong hình ảnh thành văn bản. Cảm ơn trước.
Peter Mortensen

-7

Đây sẽ là một kiểm tra đơn giản.

ví dụ 1

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

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

1
Điều này kiểm tra khóa không phải giá trị.
jcubic

1
Thing sẽ đi qua chuỗi nguyên mẫu và có lẽ sẽ làm việc như mong đợi, ví dụ! var a = {};<br/>'hasOwnProperty' in a' //true
Noctisdark
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.