【问题标题】:How to check if array has nested property with defined value如何检查数组是否具有定义值的嵌套属性
【发布时间】:2017-09-14 14:09:46
【问题描述】:

我在javascript中有一组复杂的对象和数组,例如:

var array = [
    { "simpleProp": "some value" },
    { "booleanProp": false },
    {
        "arrayProp": [
            { "prop1": "value1" },
            {
                "prop2": {
                    "prop22": "value22",
                    "prop23": "value23"
                } 
            },
            { "prop3": "value3" },
            { "booleanProp": true }
        ]
    }
];

我必须知道我的数组中是否有一个具有定义值的属性,例如:

   function some(array, property, value) {
        //some logic here
       // return boolean
    };

也就是说,对于我的源数组,这个结果:

var 结果 = some(array, "booleanProp", true) - 必须为真。

我尝试使用 lodash 函数 _.some(),但它为我的数组返回 false,似乎 _.some() 找不到深度嵌套的属性。

如果函数可以支持复杂的对象作为源,而不仅仅是数组,那就太酷了。

如果有任何帮助,我将不胜感激,谢谢。

【问题讨论】:

  • 我没听明白。你能澄清一下吗?
  • Debabrata,我想知道源数组是否像 lodash _.some()-function 那样定义了属性(键/值对),但是对于我之前展示的嵌套属性

标签: javascript knockout.js lodash


【解决方案1】:

您可以通过检查实际对象来使用迭代和递归方法,如果值是对象,则迭代对象的键。

function some(object, property, value) {
    return object[property] === value || Object.keys(object).some(function (k) {
         return object[k] && typeof object[k] === 'object' && some(object[k], property, value);
    });
}

var data = [{ simpleProp: "some value" }, { booleanProp: false }, { arrayProp: [{ prop1: "value1" }, { prop2: { prop22: "value22", prop23: "value23" } }, { prop3: "value3" }, { booleanProp: true }] }];

console.log(some(data, 'booleanProp', true)); // true
console.log(some(data, 'foo', 42));           // false

【讨论】:

  • Nina Scholz,它有效!非常感谢你!很抱歉我不能投票给你的答案(声誉不足)
【解决方案2】:

上述解决方案很棒,但不适用于 Array。 所以我稍微修改了一下,现在它适用于数组和普通属性。即使在数组中元素的位置也可以是任何东西。

const data = {
    "names": [
      {
        "name": {
          'homename': 'Raju',
          'academisName': 'Rajpal',
          'callingName': ['Raj', 'Rajpal', 'Raju']
        },
        "defaultName": "Raj"
      }]
  }

数组代码:

const some = (object, property, value) => {
  return _.isArray(value) && _.isEqual(_.sortBy(object[property]), _.sortBy(value)) || object[property] === value || Object.keys(object).some(function (k) {
    return object[k] && typeof object[k] === 'object' && some(object[k], property, value);
  });
}

const data = {
  "names": [{
    "name": {
      'homename': 'Raju',
      'academisName': 'Rajpal',
      'callingName': ['Raj', 'Rajpal', 'Raju']
    },
    "defaultName": "Raj"
  }]
}
const some = (object, property, value) => {
  return _.isArray(value) && _.isEqual(_.sortBy(object[property]), _.sortBy(value)) || object[property] === value || Object.keys(object).some(function(k) {
    return object[k] && typeof object[k] === 'object' && some(object[k], property, value);
  });
}
console.log('Result 1', some(data, 'callingName', ["Raj", "Rajpal", "Raju"]));
console.log('Result 2', some(data, 'callingName', ["Rajpal", "Raj", "Raju"]));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.js"></script>

注意:value.sort() 会改变数组,所以我使用了_.sortBy(value),同样适用于object[property]

 console.log(some(data, 'callingName',  ["Raj", "Rajpal", "Raju"]));
 console.log(some(data, 'callingName', ["Rajpal", "Raj", "Raju"]));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-30
    • 2023-01-07
    • 1970-01-01
    • 2019-06-11
    • 2020-06-08
    • 2015-08-24
    相关资源
    最近更新 更多