我試圖實作與 lodash 類似的行為,_.get()但不同之處在于該函式將能夠遍歷路徑中的所有/任何陣列,而不是指定路徑中的索引(即。'abc.xyz[0])
// Example 1
const _object = {abc: {xyz: [{value: 1}, {value: 2}]}};
console.log(accumulateValues(_object, 'abc.xyz.value');
// Desired output: [{value: 1}, {value: 2}]
// Example 2
const _object = {abc: [{xyz: [{values: 1}]}]};
console.log(accumulateValues(_object, 'abc.xyz.values');
// Desired output: [1]
uj5u.com熱心網友回復:
一個相當簡單的方法,如果你想[1, 2]擺脫它可能看起來像這樣:
const query = (path, ps = path .split ('.')) => (obj) =>
ps .reduce ((a, p) => a .flatMap (x => (x || {}) [p]) .filter (Boolean), [obj])
const _object = {abc: [{xyz: [{value: 1}, {value: 2}]}]}
console .log (query ('abc.xyz.value') (_object))
如果你正在尋找[{value: 1}, {value: 2}],它可能不會更難。但是,如果不知何故,正如問題似乎暗示的那樣,根據您的 wrap 方式'abc',您想要任何一個結果,那么我真的不明白您的要求。
這里圍繞一些節點(例如[xyz])的方括號沒有添加任何值,因為我們只是假設有一個陣列一直向下,將初始值包裝為一個。如果您仍然想提供它們,我們可以在處理之前將其洗掉:
const query = (path, ps = path .replace (/[\[\]]/g, '') .split ('.')) => (obj) =>
// ...
我們可能希望通過在將輸入包裝成一個之前檢查輸入是否已經是一個陣列來改進它以在根處獲取陣列。我把它留作練習。
uj5u.com熱心網友回復:
這是使用object-scan的解決方案。它更靈活一點,您可以例如將未知屬性與*或使用正則運算式匹配段等等(參見檔案)。
// const objectScan = require('object-scan');
const f = (needle, obj) => objectScan([needle], {
useArraySelector: false,
rtn: 'value',
reverse: false
})(obj);
const o1 = { abc: { xyz: [{ value: 1 }, { value: 2 }] } };
const r1a = f('abc.xyz', o1);
console.log(r1a);
// => [ { value: 1 }, { value: 2 } ]
const r1b = f('abc.xyz.value', o1);
console.log(r1b);
// => [ 1, 2 ]
const o2 = { abc: [{ xyz: [{ values: 1 }] }] };
const r2a = f('abc.xyz.values', o2);
console.log(r2a);
// => [ 1 ]
const r2b = f('abc.*.values', o2);
console.log(r2b);
// => [ 1 ]
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/[email protected]"></script>
免責宣告:我是物件掃描的作者
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/347359.html
標籤:javascript 数组 目的 递归 洛达什
上一篇:javascript陣列過濾器回呼與thisArg不起作用
下一篇:將物件陣列格式化為二維陣列
