检查关联数组中是否存在键

时间:2017-04-10 08:31:26

标签: javascript jquery undefined associative-array exists

告诉我,如何正确检查关联数组中是否存在键?

例如:

var mydata = {
    key1: '',
    key2: {
        subkey1: {
            subkey1_1: {
                value1: ''
                value2" '',
            },
        },
        subkey2: '';
    },
}

if ((mydata.key2 != undefined) && (mydata.key2.subkey1 != undefined) && (mydata.key2.subkey1.subkey1_1 != undefined))
    mydata.key2.subkey1.subkey1_1.value1 = 'test';

太长而且令人困惑

((mydata.key2 != undefined) && (mydata.key2.subkey1 != undefined) && (mydata.key2.subkey1.subkey1_1 != undefined))

我想使用更简单的功能,比如

safeSet(mydata.key2.subkey1.subkey1_1.value1, 'test');

if (is_undefined(mydata.key2.subkey1.subkey1_1.value1) == true)
    mydata.key2.subkey1.subkey1_1.value1 = 'test'; // now - error if 'mydata.key2.subkey1.subkey1_1' not exist

7 个答案:

答案 0 :(得分:2)

您可以使用reduce()创建自定义函数,以测试是否存在嵌套属性。您只需将密钥作为字符串传递即可。



var mydata = {
  key1: '',
  key2: {
    subkey1: {
      subkey1_1: {
        value1: '',
        value2: '',
      },
    },
    subkey2: ''
  },
}

function safeSet(key, data) {
  return key.split('.').reduce(function(r, e) {
    return r ? r[e] : undefined;
  }, data) != undefined
}

console.log(safeSet('key2.subkey1.subkey1_1.value1', mydata))




答案 1 :(得分:1)

或者,您可以使用Lodash.has()方法。 然后,您只需要检查:

if (_.has(mydata, 'key2.subkey1.subkey1_1.value1')
    mydata.key2.subkey1.subkey1_1.value1 = 'test';

答案 2 :(得分:0)

您应该使用in运算符:

"key" in obj // true, regardless of the actual value

或者,如果要特别测试对象实例的属性(而不是继承的属性),请使用hasOwnProperty:

obj.hasOwnProperty("key") // true
希望这会对你有所帮助。

来源:http://www.advancesharp.com/questions/628/checking-if-an-associative-array-key-exists-in-javascript

答案 3 :(得分:0)

为了尝试在嵌套结构中获取某些东西,我会做这样的事情:

function getPath(element, path) {
    var handledSoFar = [];
    for (var i = 0; i < path.length; i++) {
        var property = path[i];
        handledSoFar.push(property);
        if (typeof element[property] === 'undefined') {
            throw new Error('Path ' + handledSoFar.join('->') + ' is undefined');
        }
        element = object[property];
    }
    return element;
}

var mydata = {
    key1: '',
    key2: {
        subkey1: {
            subkey1_1: {
                value1: '',
                value2: 'hi'
            }
        },
        subkey2: ''
    }
};

// Prints 'hi'
console.log(getPath(mydata, ['key2', 'subkey1', 'subkey1_1', 'value2']));

// Throws error 'Path key2->subkey2->subkey1_1 is undefined'
console.log(getPath(mydata, ['key2', 'subkey1', 'subkey1_1', 'value2']));

当然,跟踪handledSoFar中的搜索是可选的,但可能对开发/调试很有用。

答案 4 :(得分:0)

您还可以使用lodash深度字段选择器:lodash.getdocumentation

const get = require('lodash.get');
const set = require('lodash.set');

if (!get(mydata, 'key2.subkey1.subkey1_1.value1')) {
    set(mydata, 'key2.subkey1.subkey1_1.value1', 'test');
}

答案 5 :(得分:0)

您可以拆分路径并检查是否存在以下元素。如果没有将对象分配给新属性。

然后返回属性的值。

最后指定值。

function setValue(object, path, value) {
    var fullPath = path.split('.'),
        way = fullPath.slice(),
        last = way.pop();

    way.reduce(function (r, a) {
        return r[a] = r[a] || {};
    }, object)[last] = value;
}

var object = { key1: '', key2: { subkey1: { subkey1_1: { value1: '', value2: '' } }, subkey2: '' } };

setValue(object, 'key2.subkey1.subkey1_1.value1', 'test');
console.log(object);

答案 6 :(得分:0)

您提出的示例函数的问题:

safeSet(mydata.key2.subkey1.subkey1_1.value1, 'test');

is_undefined(mydata.key2.subkey1.subkey1_1.value1)

mydata.key2.subkey1 ...部分是否在调用函数之前运行。因此,如果其中一个子项不存在,则在到达代码之前将抛出异常。

你可以通过回调获得类似的东西......

safeSet(function(val) { mydata.key2.subkey1.subkey1_1.value1 = val; }, 'test')
然后,safeSet的实现将是:

var safeSet = function(setterFunc, val) {
  try {
    setterFunc(val);
  } catch (e) {
    if (e instanceof TypeError) {
      return false;
    } else {
      throw e;
    }
  }
  return true;
}
如果设置了值,

safeSet返回true,否则返回false。