繁体   English   中英

打字稿中的lodash _.get函数

[英]lodash _.get function in typescript

我在谷歌搜索后得到的感觉很多lodash的功能可以通过原生打字稿来实现,但我找不到_.get函数的简单答案...

在lodash中,使用_.get函数提醒1

let obj = {a:{b:1}};
let a = _.get(obj, 'a.b');
alert(a);

有没有办法只用打字稿来达到同样的效果?

在痛苦的Javascript中,您可以通过遍历给定对象来拆分路径并减少路径。

 function getValue(object, path) { return path. replace(/\\[/g, '.'). replace(/\\]/g, ''). split('.'). reduce((o, k) => (o || {})[k], object); } var obj = { a: { b: 1 } }, a = getValue(obj, 'a.b'); console.log(a); 

/**
 * Get value of a property from a nested object.
 * Example:
 * var x = { a: {b: "c"} };
 * var valueOf_b = getDeepValue(x, ["a", "b"]);
 *
 * @param  {object}     Object           The Object to get value from
 * @param  {KeyArray}   Array[String]    An array of nested properties. ex. ["property", "childProperty"]
 */
const getDeepValue = (object, keyArray) => {
    const extractValue = (obj, kArray) => {
        const objProperty = obj[kArray[0]];
        if (kArray.length >= 1) {
            const newKeyArray = kArray.splice(1, kArray.length);
            if (newKeyArray.length === 0) return objProperty;
            return extractValue(objProperty, newKeyArray);
        }
        return objProperty;
    };

    try {
        const value = extractValue(object, keyArray.slice());
        if (value === undefined || typeof value === 'object') {
            console.warn("Unable to retrieve value from object for key ", keyArray);
            return '';
        } else {
            return value;
        }
    } catch (e) {
        console.warn("Exception: Unable to retrieve value from object for key ", keyArray);
        return '';
    }
};

使用ES6默认参数可能稍微更清洁一些:

const get = (o, path) => path.split('.').reduce((o = {}, key) => o[key], o);
console.log(get({ a: { b: 43 } }, 'a.b')); // 43

即使遇到undefined,上面也会一直挖到底部。 另一种方法是递归,你必须在调用它之前拆分它:

function get(object, [head, ...tail]) {
    object = object[head];
    return tail.length && object ? get(object, tail) : object;
}

console.log(get({ a: { b: 43 } }, 'a.b'.split('.'))); // 43

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM