简体   繁体   English

打字稿中的lodash _.get函数

[英]lodash _.get function in typescript

I get the feeling after some googling that a lot of lodash's functions can be achieved with native typescript but i cannot find a straightforward answer for the _.get function... 我在谷歌搜索后得到的感觉很多lodash的功能可以通过原生打字稿来实现,但我找不到_.get函数的简单答案...

In lodash the following, using the _.get function alerts 1 在lodash中,使用_.get函数提醒1

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

Is there a way of achieving the same result with only typescript? 有没有办法只用打字稿来达到同样的效果?

In pain Javascript you could split the path and reduce the path by walking the given object. 在痛苦的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 '';
    }
};

Maybe slightly cleaner alternative using an ES6 default parameter: 使用ES6默认参数可能稍微更清洁一些:

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

The above digs all the way to the bottom even when it encounters undefined. 即使遇到undefined,上面也会一直挖到底部。 An alternative is recursion, you'll have to split before invoking it: 另一种方法是递归,你必须在调用它之前拆分它:

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