aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.some và every: chọn đúng câu hỏi, nhớ trường hợp mảng rỗng

Suong Nguyen by Suong Nguyen
03/11/2026
in Đánh giá
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Bạn cần bật nút khi có ít nhất một dòng được chọn, hoặc khi mọi dòng đều hợp lệ. Hai yêu cầu nghe gần nhau nhưng trả lời khác nhau ở cả dữ liệu thường lẫn mảng rỗng. Dùng đúng phép kiểm tra giúp người review thấy quy tắc mà không phải giải mã một vòng lặp đếm.

Bài so sánh theo cùng tiêu chí: ý nghĩa Boolean, thời điểm dừng, case rỗng, yêu cầu runtime và chi phí tích hợp. Các snippet đã chạy bằng Node.js 24.18.1; tài liệu MDN được đối chiếu ngày 03/11/2026. Không có benchmark và không suy ra thứ hạng tốc độ cho dữ liệu sản phẩm.

Chạy hai câu hỏi trên cùng dữ liệu

Lưu thành predicates.cjs, chạy node predicates.cjs:

const assert = require('node:assert/strict');
const rows = [
  {id: 1, valid: true},
  {id: 2, valid: false},
  {id: 3, valid: true},
];

assert.equal(rows.some(row => row.valid), true);
assert.equal(rows.every(row => row.valid), false);
assert.equal(rows.some(row => !row.valid), true);

let someCalls = 0;
let everyCalls = 0;
rows.some(row => { someCalls += 1; return row.valid; });
rows.every(row => { everyCalls += 1; return row.valid; });
assert.equal(someCalls, 1);
assert.equal(everyCalls, 2);
console.log('some/every fixture passed');

Các assertion đã qua. Trong fixture này, some tìm được một dòng hợp lệ ngay đầu; every gặp phản ví dụ ở dòng thứ hai. Số lần callback là bằng chứng cho đúng dữ liệu đang dùng, không phải phép đo thời gian xử lý hay cam kết tăng tốc bao nhiêu phần trăm.

Về quyền kiểm soát, cả hai nhận predicate do bạn định nghĩa và trả Boolean. Nếu cần chính phần tử hoặc tập phần tử, chúng không trả dữ liệu ấy thay bạn. Về tích hợp, không cần dependency ngoài; vẫn cần đối chiếu runtime mục tiêu nếu code chạy trong môi trường nhúng hoặc legacy.

Mảng rỗng cần được chốt trong yêu cầu

Chạy snippet độc lập:

const assert = require('node:assert/strict');
const rows = [];
let calls = 0;
const valid = row => { calls += 1; return row.valid; };

assert.equal(rows.some(valid), false);
assert.equal(rows.every(valid), true);
assert.equal(calls, 0);

const canSubmit = rows.length > 0 && rows.every(row => row.valid);
assert.equal(canSubmit, false);
console.log('empty-list policy passed');

Kết quả đã kiểm tra là some bằng false, every bằng true và không gọi predicate. every không tìm thấy phần tử nào vi phạm; điều này không đồng nghĩa đơn hàng rỗng được phép gửi. Dòng rows.length > 0 thể hiện yêu cầu ít nhất một phần tử một cách riêng biệt.

Trong review, hãy hỏi danh sách rỗng có hợp lệ hay không trước khi kết luận every bị lỗi. Với một bộ điều kiện tùy chọn, “không có điều kiện nào bị vi phạm” có thể đúng theo thiết kế. Với form bắt buộc chọn ít nhất một mục, cần thêm điều kiện về số lượng.

Giữ predicate đơn giản và đồng bộ

Các callback được kiểm tra dựa trên giá trị truthy hoặc falsy. Nếu trường valid chưa được chuẩn hóa, chuỗi 'false' vẫn truthy và có thể tạo kết quả khác yêu cầu. Ví dụ trong bài cố ý dùng Boolean thật, không nhận JSON bất kỳ rồi coi predicate là schema validator.

Không truyền một hàm async rồi kỳ vọng some hoặc every chờ kết quả mạng. Promise trả về không phải Boolean của kết quả đã hoàn thành. Với kiểm tra bất đồng bộ, cần một luồng chờ kết quả riêng trước khi áp dụng quy tắc quyết định; bài này chỉ đánh giá predicate đồng bộ.

Ngoài ra, các method bỏ qua empty slot của sparse array. Dữ liệu fixture là mảng đặc; điều kiện length > 0 một mình không chứng minh mọi vị trí đều chứa bản ghi hợp lệ. Kiểm tra cấu trúc đầu vào riêng nếu hệ thống có thể tạo mảng có lỗ.

Chọn theo câu hỏi cần trả lời

Dùng some khi một phần tử thỏa là đủ. Dùng every khi không được có phần tử vi phạm, và bổ sung điều kiện không rỗng nếu nghiệp vụ cần. Không thay thế lẫn nhau chỉ vì một cách viết nhìn ngắn hơn.

Với cùng bộ dữ liệu, hãy giữ test cho tất cả đúng, có một sai, tất cả sai và rỗng. Những case nhỏ ấy xác nhận hợp đồng rõ hơn một bài benchmark khi câu hỏi chính vẫn là nút có được bật hay không.

Nguồn tham khảo

  • MDN: Array.some
  • MDN: Array.every

Tags: ArrayĐánh giáJavaScript
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Object.hasOwn và in: chọn theo thuộc tính riêng hay cả prototype

by Suong Nguyen
02/11/2026
0

Đối chiếu hasOwn, in và hasOwnProperty bằng cùng bộ case: kế thừa, undefined, object không prototype và method bị che.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.find và filter: chọn theo một hay nhiều kết quả

by Suong Nguyen
01/11/2026
0

So sánh kiểu kết quả, xử lý không tìm thấy và số lần gọi predicate để chọn find hoặc filter đúng nhu cầu.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

String.length và Buffer.byteLength: chọn phép đo cho UTF‑8

by Suong Nguyen
31/10/2026
0

So sánh độ dài chuỗi và số byte UTF‑8 bằng ví dụ tiếng Việt, emoji và JSON để chọn đúng đơn vị giới hạn.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Date.now hay performance.now: chọn đồng hồ để ghi thời điểm và đo thời lượng

by Suong Nguyen
30/10/2026
0

So sánh mốc thời gian, tính đơn điệu và phạm vi sử dụng để tránh dùng timestamp như một phép đo thời lượng đáng tin cậy.

Next Post
Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

GitHub Actions GITHUB_ENV: giá trị mới dành cho step tiếp theo

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native Text: rút gọn hai dòng và vẫn có đường đọc đầy đủ
  • Vì sao map(parseInt) biến index thành radix?
  • Android INVISIBLE và GONE: ẩn nội dung có cần giữ chỗ không?

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply