基于索引的阵列上的对象摘去特定JavaScript值(Pluck specific javascri

2019-08-01 06:20发布

给定一个嵌套的对象是这样的:

var cars = {
    "bentley": {
        "suppliers": [
            {
            "location": "England",
            "name": "Sheffield Mines"}
        ]
        // ...
    }
};

和一个这样的数组["bentley", "suppliers", "0", "name"]有一个现有的功能,这将采摘的最深元件,即pluck_innards(cars, ['bentley', "suppliers", "0", "name"])和返回‘谢菲尔德矿’。

换句话说,是否有一个功能(我将其命名为deep_pluck ),其中

deep_pluck(cars, ['bentley', 'suppliers', '0', 'name']) 
         === cars['bentley']['suppliers']['0']['name']

在我看来,这是简单的,但很常见,对可能一直在使用Javascript工具库,如一个完成的jQuery或LO-破折号 /下划线-但我还没有看到它。

我的想法是一些小事,沿着线:

function deep_pluck(array, identities) {
    var this_id = identities.shift();
    if (identities.length > 0) {
        return deep_pluck(array[this_id], identities);
    }
    return array[this_id];
}

我已经张贴上的jsfiddle 。

如果功能足够聪明,需要在阵列中的数值索引时找出这将是有益的,当然。 我不知道随便什么其他注意事项可能是一个问题。

这是我的东西想象已经被巧妙地解决了所有相当长的问题,但我认为这后,我会希望看到的解决方案是在那里什么。

Answer 1:

我不认为,如果你将它们作为数字你必须与数组索引的问题0

这里是你的函数的替代版本,且无需递归:

function deep_pluck(object, identities) {
    var result = object;
    for(var i = 0; i < identities.length; i++) {
        result = result[identities[i]];
    }
    return result;
}

工作示例这里: http://jsfiddle.net/AmH2w/1/



Answer 2:

dotty.get(OBJ,pathspec)这样做,接受任一阵列或虚线字符串作为pathspec。

多点的是开源的,并且还具有存在的方法,以及一推杆。

该方法是递归和非常相似,你的想法,只是疯疯癫癫包括对空/未定义对象的测试,以便它不会引发异常的试图访问的东西不存在的元素。

在从文档dotty.get()源张贴下面:

var get = module.exports.get = function get(object, path) {
  if (typeof path === "string") {
    path = path.split(".");
  }

  if (!(path instanceof Array) || path.length === 0) {
    return;
  }

  path = path.slice();

  var key = path.shift();

  if (typeof object !== "object" || object === null) {
    return;
  }

  if (path.length === 0) {
    return object[key];
  }

  if (path.length) {
    return get(object[key], path);
  }
};


Answer 3:

虽然不是一个通用库,似乎CasperJS有这种与它的东西utils.getPropertyPath功能。

/**
 * Retrieves the value of an Object foreign property using a dot-separated
 * path string.
 *
 * Beware, this function doesn't handle object key names containing a dot.
 *
 * @param  Object  obj   The source object
 * @param  String  path  Dot separated path, eg. "x.y.z"
 */
function getPropertyPath(obj, path) {
    if (!isObject(obj) || !isString(path)) {
        return undefined;
    }
    var value = obj;
    path.split('.').forEach(function(property) {
        if (typeof value === "object" && property in value) {
            value = value[property];
        } else {
            value = undefined;
        }
    });
    return value;
}

编辑:

我所遇到的实现,因为解决这个几次,其中包括:

  1. 在的getObject插件由Ben Alman(在Github上 )。
  2. 一个我滚-见要点

编辑(2014)

我还要指出,相对较新的lodash.deep



Answer 4:

下面是使用短ES6实现reduce

function get(obj, keyPath) {
    return keyPath
        .split(".")
        .reduce((prev, curr) => prev[curr], obj);
}

用法:

get(cars, "bentley.suppliers.0.name") // -> "Sheffield Mines"


文章来源: Pluck specific javascript value from an object based on an array of indexes