【问题标题】:Checking if a Javascript object contains the same key/value Lodash检查 Javascript 对象是否包含相同的键/值 Lodash
【发布时间】:2016-06-30 22:09:03
【问题描述】:

无法弄清楚如何在由对象组成的数组中找到相等的键:值。

我有一个数组,其中的对象看起来像这样

[{
0:false, 
1:false, 
2:false, 
3:true, 
4:false, 
5:false
},{
0:false, 
1:false, 
2:false, 
3:true, 
4:false, 
5:false
},{
0:false, 
1:false, 
2:false, 
3:true, 
4:false, 
5:false
}]

我需要用对象迭代这个数组,如果所有对象都获得具有真值的相同键(在上面的示例中,所有对象都具有相同的 key:3value: true)然后我需要捕获这个键(位置)。

对此最好的解决方案是什么?我也使用 Lodash,所以也许使用这个库很容易获得我想要的东西,或者使用纯 JavaScript。不管怎么弄,只需要一个正确的解决方案。

【问题讨论】:

  • 我同意你的观点,这可能不是一项艰巨的工作。但我试图在 StackOverflow 上搜索答案或解决方案,但没有成功,因为在 Objects 中有不同的键,我决定问。
  • 很公平。看我的回答。

标签: javascript arrays object lodash


【解决方案1】:

使用_.findKey_.every

var arr = [{"0":false,"1":false,"2":false,"3":true,"4":false,"5":false},{"0":false,"1":false,"2":false,"3":true,"4":false,"5":false},{"0":false,"1":false,"2":false,"3":true,"4":false,"5":false}];

var key = _.findKey(arr[0], function(val, key) {
  return val && _.every(arr, key);
});
                        
console.log(key);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

如果您使用的是 ES6,则可以将其缩短为:

let key = _.findKey(arr[0], (v, k) => v && _.every(arr, k));

如果您决定改用更自然的二维数组结构,请改用_.findIndex

[
  [false,false,false,true,false,false],
  [false,false,false,true,false,false],
  [false,false,false,true,false,false],
  [false,false,false,true,false,false],
  [false,false,false,true,false,false]
]

【讨论】:

    【解决方案2】:

    首先,为了简单起见,我将键作为数组索引的对象更改为数组,因为这就是数组:只需 a special object with indices as keys


    你可以试试这个。它不使用 lodash(我不熟悉,抱歉),但它的作用是:

    1. 从一个包含与每个对象长度匹配的所有 true 值的数组开始(即长度为 6)
    2. 循环遍历每个对象和每个对象的每个属性。
    3. 如果是false,那么该索引的值为false。如果为真,则如果索引已经为true,则索引将为true
    4. 打印出剩余的索引true

    你可以通过下面的代码明白我的意思:

    var list = [[false,false,false,true,false,false],[false,false,false,true,false,false],[false,false,false,true,false,false],[false,false,false,true,false,false],[false,false,false,true,false,false]];
    
    var trueKeys = [true, true, true, true, true, true];
    for(obj in list)
      for(prop in list[obj])
        trueKeys[prop] = trueKeys[prop] && list[obj][prop];
    var index = trueKeys.indexOf(true);
    
    console.log(index);

    【讨论】:

    • 无需遍历每个数组中的所有值。只需在第一个数组中找到true 的索引,然后检查所有其余数组是否在该索引处也有true。这是将 O(n+m) 操作变为 O(n*m)
    • 我没有意识到这一点,@4castle。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2021-01-17
    • 2023-03-08
    • 2020-07-09
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多