Đường Dẫn Hoang Dã
🤠 Đường dẫn thuộc tính đối tượng với ký tự đại diện và biểu thức chính quy. 🌵
Lấy/đặt các thuộc tính đối tượng bằng cách sử dụng:
- ⛏️ Đường dẫn dấu chấm:
foo.bar.0.baz
- ⭐ Ký tự đại diện:
foo.*
,**.bar
- 🗺️ Biểu thức chính quy:
foo./ba?/
- 🏜️ Phạm vi:
foo.0:2
- 🚂 Liên kết:
foo bar baz
Cài Đặt
npm install wild-wild-path
Gói này hoạt động trên cả Node.js >=16.17.0 và browsers.
Đây là một mô-đun ES. Nó phải được tải bằng an import or import() statement, không phải require()
. Nếu sử dụng TypeScript, nó phải được cấu hình để sử dụng output ES modules, không phải CommonJS.
API
Phương Pháp
get(target, query, options?)
target
: Target
query
: Query
options
: Options?
Giá trị trả về : bất kỳ | không xác định
Trả về thuộc tính đầu tiên phù hợp với query
.
const target = { settings: { colors: ['red', 'blue'] } }
get(target, 'settings.colors.0') // 'red'
get(target, ['settings', 'colors', 0]) // 'red'
has(target, query, options?)
target
: Target
query
: Query
options
: Options?
Giá trị trả về : boolean
Trả về liệu query
có khớp với bất kỳ thuộc tính nào không.
const target = { settings: { lastName: undefined, colors: ['red', 'blue'] } }
has(target, 'settings.firstName') // false
has(target, ['settings', 'firstName']) // false
has(target, 'settings.lastName') // true
list(target, query, options?)
target
: Target
query
: Query
options
: Options?
Giá trị trả về : mảng bất kỳ
Trả về tất cả thuộc tính phù hợp với query
, dưới dạng mảng.
const target = {
userOne: { firstName: 'John', lastName: 'Doe', age: 72 },
userTwo: { firstName: 'Alice', colors: ['red', 'blue', 'yellow'] },
}
list(target, 'userOne.firstName userTwo.colors.0') // ['John', 'red']
list(target, [
['userOne', 'firstName'],
['userTwo', 'colors', 0],
]) // ['John', 'red']
list(target, 'userOne./Name/') // ['John', 'Doe']
list(target, ['userOne', /Name/]) // ['John', 'Doe']
list(target, 'userTwo.colors.*') // ['red', 'blue', 'yellow']
list(target, 'userTwo.colors.0:2') // ['red', 'blue']
list(target, '**.firstName') // ['John', 'Alice']
list(target, 'userOne.*', { entries: true })
// [
// { value: 'John', path: ['userOne', 'firstName'], missing: false },
// { value: 'Doe', path: ['userOne', 'lastName'], missing: false },
// { value: 72, path: ['userOne', 'age'], missing: false },
// ]
iterate(target, query, options?)
target
: Target
query
: Query
options
: Options?
Giá trị trả về : Iterable
Trả về tất cả thuộc tính phù hợp với query
, dưới dạng iterable. Điều này chậm hơn list()
nhưng tiêu thụ ít bộ nhớ hơn.
const target = { settings: { colors: ['red', 'blue'] } }
for (const color of iterate(target, 'settings.colors.*')) {
console.log(color) // 'red', 'blue'
}
set(target, query, value, options?)
target
: Target
query
: Query
value
: bất kỳ
options
: Options?
Giá trị trả về : Target
Đặt tất cả thuộc tính phù hợp với query
. Giá trị trả về là bản sao sâu trừ khi tùy chọn mutate
là true
.
const target = { colors: ['red', 'blue'] }
set(target, 'colors.0', 'yellow') // ['yellow', 'blue']
set(target, ['colors', 0], 'yellow') // ['yellow', 'blue']
set(target, 'colors.-1', 'yellow') // ['red', 'yellow']
set(target, 'colors.-0', 'yellow') // ['red', 'blue', 'yellow']
set(target, 'colors.*', 'yellow') // ['yellow', 'yellow']
set({}, 'user.0.color', 'red') // { user: [{ color: 'red' }] }
set({}, 'user.0.color', 'red', { missing: false }) // {}
remove(target, query, options?)
target
: Target
query
: Query
options
: Options?
Giá trị trả về : Target
Xóa tất cả thuộc tính phù hợp với query
. Giá trị trả về là bản sao sâu trừ khi tùy chọn mutate
là true
.
const target = { user: { firstName: 'John', lastName: 'Doe', age: 72 } }
remove(target, 'user.lastName') // { user: { firstName: 'John', age: 72 } }
remove(target, 'user./Name/') // { user: { age: 72 } }
remove(target, ['user', /Name/]) // { user: { age: 72 } }
Công cụ hàm
wild-wild-utils là một thư viện riêng biệt cung cấp các phương thức cấp cao bổ sung: map(), merge(), push(), unshift(), find(), pick(), include(), exclude(), flatten().
Mục tiêu
Giá trị mục tiêu phải là một đối tượng hoặc một mảng.
Truy vấn
Có hai định dạng tương đương cho truy vấn: chuỗi và mảng.
- Chuỗi truy vấn thân thiện hơn với việc sử dụng CLI, biểu thức phong phú hơn và dễ dàng để tuần tự hóa.
- Mảng truy vấn thân thiện hơn với việc sử dụng lập trình, và nhanh hơn. Hơn nữa, chúng không yêu cầu ký tự thoát, vì vậy nên sử dụng khi đầu vào là động hoặc do người dùng cung cấp để ngăn chặn tấn công chèn mã.
Chuỗi truy vấn
⛏️ Thuộc tính sâu
# Deep properties of objects or arrays.
# Dots are used for array indices, not brackets.
# Symbol properties are always ignored.
user.colors.0
🚂 Liên kết
# Unions ("or") of queries are space-delimited.
# The string must not be empty.
colors name age
⭐ Ký tự đại diện
# Shallow wildcards target all properties/items of a single object/array
user.*
# Deep wildcards target all properties/items of 0, 1 or many objects/arrays
user.**
**.colors
🗺️ Biểu thức chính quy
# Regexps match property names
user./name/
# Flags can be used, e.g. to make it case-insensitive
user./name/i
# ^ $ must be used to match from the beginning or until the end
user./^name$/i
🌵 Chỉ số mảng
# Array indices are integers
user.colors.0
# Array indices can be negative.
# -1 is the last item.
# -0 is the item after it, which can be used to append.
user.colors.-1
🏜️ Đoạn mảng
# Array slices. Goes from the start (included) to the end index (excluded).
user.colors.0:2
# The start index defaults to 0, i.e. the beginning
user.colors.:2
# The end index defaults to -0, i.e. the end
user.colors.0:
user.colors.:
🪨 Thoát ký tự
# Dots, spaces and backslashes in property names must be escaped
name\\ with\\ spaces
name\\.with\\.dots
name\\\\with\\\\backslashes
# Ambiguous property names must be escaped with a backslash at the beginning.
# This includes properties that:
# - Are integers but are not array elements
# - Have multiple slashes and start with one
name.\\0
name.\\/not_a_regexp/
🏨 Gốc và chuỗi trống
# A leading dot can optionally be used. It is ignored.
user.colors
.user.colors
# Root value
.
# Empty string properties
user..colors
Mảng truy vấn
⛏️ Thuộc tính sâu
// Deep properties of objects or arrays.
// Symbol properties are always ignored.
['user', 'colors', 0]
🚂 Liên kết
// Unions ("or") of queries are arrays of arrays.
// There must be at least one item.
[['colors'], ['name'], ['age']]
⭐ Ký tự đại diện
// Shallow wildcards target all properties/items of a single object/array
['user', { type: 'any' }]
// Deep wildcards target all properties/items of 0, 1 or many objects/arrays
['user', { type: 'anyDeep' }]
[{ type: 'anyDeep' }, 'colors']
🤠 Biểu thức chính quy
// Regexps match property names
['user', /name/]
// Flags can be used, e.g. to make it case-insensitive
['user', /name/i]
// ^ $ must be used to match from the beginning or until the end
['user', /^name$/i]
🌵 Chỉ số mảng
// Array indices are integers, not strings
['user', 'colors', 0]
// Array indices can be negative.
// -1 is the last item.
// -0 is the item after it, which can be used to append.
['user', 'colors', -1]
🏜️ Đoạn mảng
// Array slices. Goes from the start (included) to the end index (excluded).
['user', 'colors', { type: 'slice', from: 0, to: 2 }]
// The start index defaults to 0, i.e. the beginning
['user', 'colors', { type: 'slice', to: 2 }]
// The end index defaults to -0, i.e. the end
['user', 'colors', { type: 'slice', from: 0 }]
['user', 'colors', { type: 'slice' }]
🪨 Thoát ký tự
// Escaping is not necessary with query arrays
['name with spaces']
['name.with.dots']
['name\\with\\backslashes']
['name', '0']
['name', '/not_a_regexp/']
🏨 Gốc và chuỗi trống
// Root value
[]
// Empty string properties
['user', '', 'colors']
Đường Dẫn
Một “đường dẫn” là bất kỳ truy vấn nào chỉ sử dụng tên thuộc tính và chỉ số mảng dương. Điều này không bao gồm chỉ số âm, phạm vi, ký tự đại diện, biểu thức chính quy và liên kết.
Các đường dẫn được trả về bởi tùy chọn entries
.
# Path string
user.colors.0
// Path array
['user', 'colors', 0]
Chuyển đổi và so sánh
wild-wild-parser có thể được sử dụng để chuyển đổi giữa cả hai định dạng hoặc để so sánh các truy vấn.
Giá trị không xác định
Các thuộc tính đối tượng có khóa xác định nhưng có giá trị undefined
không bị bỏ qua. Tuy nhiên, các thuộc tính đối tượng mà không có khóa xác định nào bị bỏ qua. Phương thức has()
, tùy chọn missing
và tùy chọn entries
có thể được sử dụng để phân biệt chúng.
const target = { name: undefined }
has(target, 'name') // true
has(target, 'colors') // false
get(target, 'name') // undefined
get(target, 'colors') // undefined
get(target, 'name', { entries: true, missing: true })
// { value: undefined, path: ['name'], missing: false }
get(target, 'colors', { entries: true, missing: true })
// { value: undefined, path: ['colors'], missing: true }
list(target, '*') // [undefined]
list(target, '*', { entries: true })
// [{ value: undefined, path: ['name'], missing: false }]
Tùy chọn
Các tùy chọn là các đối tượng thuần túy tùy chọn.
mutate
Phương pháp : set()
, remove()
Kiểu : boolean
Mặc định : false
Mặc định, mục tiêu được sao chép sâu.
Khi true
, nó được biến đổi trực tiếp, điều này nhanh hơn nhưng có hiệu ứng phụ.
const target = {}
console.log(set(target, 'name', 'Alice')) // { name: 'Alice' }
console.log(target) // {}
console.log(set(target, 'name', 'Alice', { mutate: true })) // { name: 'Alice' }
console.log(target) // { name: 'Alice' }
entries
Phương pháp : get()
, list()
, iterate()
Kiểu : boolean
Mặc định : false
Mặc định, giá trị của thuộc tính được trả về.
Khi true
, các đối tượng với cấu trúc sau được trả về thay thế:
value
bất kỳ
: giá trị thuộc tínhpath
Đường dẫn
: đường dẫn đầy đủ của thuộc tính-
missing
boolean
: liệu thuộc tính có bị thiếu từ mục tiêu hay khôngconst target = { firstName: ‘Alice’, lastName: ‘Smith’ }
list(target, ‘‘) // [‘Alice’, ‘Smith’]
list(target, ‘‘, { entries: true })
// [
// { value: ‘Alice’, path: [‘firstName’], missing: false },
// { value: ‘Smith’, path: [‘lastName’], missing: false },
// ]
missing
Phương pháp : tất cả trừ has()
và remove()
Kiểu : boolean
Mặc định : false
với list|iterate()
, true
với set()
Khi false
, các thuộc tính không được định nghĩa trong mục tiêu sẽ bị bỏ qua.
const target = {}
set(target, 'name', 'Alice') // { name: 'Alice' }
set(target, 'name', 'Alice', { missing: false }) // {}
list(target, 'name') // []
list(target, 'name', { missing: true, entries: true })
// [{ value: undefined, path: ['name'], missing: true }]
sắp xếp
Phương pháp : get()
, list()
, iterate()
Kiểu : boolean
Mặc định : false
Khi trả về các thuộc tính anh em, sắp xếp chúng theo thứ tự từ điển của tên của chúng (không phải giá trị).
const target = { lastName: 'Doe', firstName: 'John' }
list(target, '*') // ['Doe', 'John']
list(target, '*', { sort: true }) // ['John', 'Doe']
childFirst
Phương pháp : get()
, list()
, iterate()
Kiểu : boolean
Mặc định : false
Khi sử dụng liên kết hoặc ký tự đại diện sâu, một truy vấn có thể khớp cả thuộc tính và một số con của nó.
Tùy chọn này quyết định liệu các thuộc tính trả về nên được sắp xếp từ con đến cha, hoặc ngược lại.
const target = { user: { name: 'Alice' } }
list(target, 'user.**') // [{ name: 'Alice' }, 'Alice']
list(target, 'user.**', { childFirst: true }) // ['Alice', { name: 'Alice' }]
leaves
Phương pháp : tất cả trừ has()
Kiểu : boolean
Mặc định : false
Khi sử dụng liên kết hoặc ký tự đại diện sâu, một truy vấn có thể khớp cả thuộc tính và một số con của nó.
Khi true
, chỉ có các lá được khớp. Nói cách khác, thuộc tính khớp sẽ bị bỏ qua nếu một trong các con của nó cũng khớp.
const target = { user: { name: 'Alice' } }
list(target, 'user.**') // [{ name: 'Alice' }, 'Alice']
list(target, 'user.**', { leaves: true }) // ['Alice']
roots
Phương pháp : get()
, list()
, iterate()
Kiểu : boolean
Mặc định : false
Khi sử dụng liên kết hoặc ký tự đại diện sâu, một truy vấn có thể khớp cả thuộc tính và một số con của nó.
Khi true
, chỉ có các gốc được khớp. Nói cách khác, thuộc tính khớp sẽ bị bỏ qua nếu một trong các cha của nó cũng khớp.
const target = { user: { name: 'Alice' } }
list(target, 'user.**') // [{ name: 'Alice' }, 'Alice']
list(target, 'user.**', { roots: true }) // [{ name: 'Alice' }]
shallowArrays
Phương pháp : tất cả
Kiểu : boolean
Mặc định : false
Nếu true
, các ký tự đại diện không đệ quy trên mảng. Các phần tử mảng vẫn có thể khớp bằng cách sử dụng chỉ số hoặc đoạn.
const target = [{ name: 'Alice' }, { name: 'Bob' }]
list(target, '**')
// [
// [{ name: 'Alice' }, { name: 'Bob' }],
// { name: 'Alice' },
// 'Alice',
// { name: 'Bob' },
// 'Bob',
// ]
list(target, '**', { shallowArrays: true })
// [
// [{ name: 'Alice' }, { name: 'Bob' }],
// ]
classes
Phương pháp : tất cả
Kiểu : boolean
Mặc định : false
Trừ khi true
, wildcards và regexps sẽ bỏ qua các thuộc tính của các đối tượng không phải là đối tượng đơn giản (như các thể hiện lớp, lỗi hoặc hàm). Những thứ đó vẫn có thể phù hợp bằng cách sử dụng tên thuộc tính của chúng.
const target = { user: new User({ name: 'Alice' }) }
list(target, 'user.*') // []
list(target, 'user.*', { classes: true }) // ['Alice']
Kế thừa
Phương thức : tất cả
Kiểu : boolean
Mặc định : false
Theo mặc định, wildcards và regexps sẽ bỏ qua các thuộc tính đã được inherited hoặc not enumerable. Những thứ đó vẫn có thể phù hợp bằng cách sử dụng tên thuộc tính của chúng.
Khi true
, các thuộc tính được kế thừa sẽ không bị bỏ qua, nhưng những thuộc tính không thể liệt kê vẫn sẽ bị bỏ qua.
Dự án liên quan
- wild-wild-utils: các tiện ích chức năng sử dụng các đường dẫn thuộc tính đối tượng của
wild-wild-path
- wild-wild-parser: trình phân tích cho các đường dẫn thuộc tính đối tượng của
wild-wild-path
Hỗ trợ
Đối với bất kỳ câu hỏi nào, đừng ngần ngại gửi một vấn đề trên GitHub.
Mọi người đều được chào đón bất kể nền tảng cá nhân. Chúng tôi thực thi Mã đạo đức để thúc đẩy một môi trường tích cực và bao hàm.
Đóng góp
Dự án này được tạo ra bằng trái tim ❤️. Cách đơn giản nhất để đóng góp là bằng cách thêm dấu sao và chia sẻ trực tuyến.
Nếu tài liệu không rõ ràng hoặc có lỗi chính tả, vui lòng nhấp vào nút Chỉnh sửa
trên trang (biểu tượng bút chì) và đề xuất một sửa đổi.
Nếu bạn muốn giúp chúng tôi sửa lỗi hoặc thêm tính năng mới, vui lòng kiểm tra hướng dẫn của chúng tôi. Chúng tôi hoan nghênh các yêu cầu Pull!
Thông tin tải về:
Tác giả: ehmicky
Mã nguồn: https://github.com/ehmicky/wild-wild-path
Giấy phép: Apache-2.0 license
Cảm ơn bạn!