【问题标题】:compare object value with length of array in an object with javascript使用javascript将对象值与对象中的数组长度进行比较
【发布时间】:2015-06-12 06:43:37
【问题描述】:

编辑:已解决请参阅下面的最终解决方案

编辑:值名称不一样

对象 1

var obj1 = {
    val1a : 4,
    val2a : 3 ,
    val3a : 7
}

带有数组的对象 2

var obj2 = {
    val1b : [one, two, three],
    val2b : [oneA, twoA, threeA],
    val3b : [oneB]
}

我正在尝试做的是以下

if(obj1.val1a  === obj2.val1b.length){
// code
}

但我不希望它如此具体。有没有办法遍历每个对象并返回与 obj1 不匹配的 obj2 的值

下划线解决方案

   function checkData(obj1, obj2) {

        result = []

        var keys_obj1 = Object.keys( obj1)

        var keys_obj2 = Object.keys( obj2)         

        _.each(keys_obj1, function(num, i){
            if(obj1[keys_obj1[i]].length  !== obj2[keys_obj2[i]]) {
               result.push(keys_obj1[i]);
            }
        })
        return result;

    }

【问题讨论】:

  • 每个对象中的键是否按名称相关?如果有怎么办?还是你只是想按顺序比较?
  • 您是如何构建数据的?
  • 他们永远不一样?有什么模式吗?第一个 obj 总是 val[i]a,第二个 obj 总是 val[i]b?
  • 不,它们总是不同的,如果它们相同,那么答案将很容易,因为您可以匹配名称
  • 它们是否总是具有 val[num][letter] 模式,或者对象是否具有键 orangemoosegopher,例如?

标签: javascript


【解决方案1】:

最好的方法是,如果两个对象具有相同的名称(对于给定的对),然后使用 The For/In Loop 迭代其中一个并返回两者的值,然后进行比较。罢工>

使用Object.keys 重新制作小提琴,为两个对象创建一个键数组,现在即使键不相同(遵循对象索引)也可以工作

var obj1 = {
    val1a : 4,
    val2a : 3 ,
    val3a : 7
}

var obj2 = {
    val1b : ['one', 'two', 'three'],
    val2b : ['oneA', 'twoA', 'threeA'],
    val3b : ['oneB']

}

var keys_obj1 = Object.keys( obj1 )
var keys_obj2 = Object.keys( obj2 )

for (i = 0; i < keys_obj1.length; i++) {
    console.log(keys_obj1[i]+'-'+obj1[keys_obj1[i]])
    console.log(keys_obj2[i]+'-'+obj2[keys_obj2[i]].length);
    if(obj1[keys_obj1[i]]  === obj2[keys_obj2[i]].length) {
        //match
    }
}

控制台输出:

"val1a-4"
"val1b-3"
"val2a-3"
"val2b-3"
"val3a-7"
"val3b-1"

【讨论】:

  • 不幸的是名字不一样; /否则是的,这将起作用
【解决方案2】:

如果您的模型不是最终模型,您可以使用如下对象数组:

var object = [
   {table : [one, two, three], length : 3},
   {table : [one, two, three], length : 4},
... ];

并使用比较值:

object[i].table.length === object[i].length

它和你的模型有点不同

但我希望它会有所帮助。

【讨论】:

    【解决方案3】:

    相当冗长,但我能想到的唯一方法:

    // for each object you are going to...
    function pullData(obj) {
        var out = {};
        var token;
    
        // grab the keys
        var keys = Object.keys(obj).map(function (el) {
    
          // token is the character at the end of the key
          // the key that is returned is the key without the token
          token = el.slice(-1)
          return el.slice(0, 4);
        });
    
        // for each key, add it to the output object
        for (var i = 0, l = keys.length; i < l; i++) {
         out[keys[i]] = obj[keys[i] + token]
        }
    
        // return an object containing the data and the token
        return {data: out, token: token};
    }
    
    // take both the output from both objects being parsed
    function isNotMatch(obj1, obj2) {
        var out = [];
    
        // loop over the first object using the now identical keys
        for (var p in obj1.data) {
    
            // check the values and lengths
            // if they're not the same push the key and the token as a string
            // to the output array
            if (obj1.data[p] !== obj2.data[p].length) {
              out.push(p + obj2.token);
            }
        }
    
        // return the array of non-matches
        return out;
    }
    
    isNotMatch(pullData(obj1), pullData(obj2));
    

    DEMO

    【讨论】:

      【解决方案4】:

      更新: 也许是这样的。您必须确保属性名称相同:

      var obj1 = {
          val1a : 4,
          val2a : 3 ,
          val3a : 7
      };
      
      var obj2 = {
          val1a : ['one', 'two', 'three'],
          val2a : ['oneA', 'twoA', 'threeA'],
          val3a : ['oneB']
      };
      
      for(var name in obj1) {
          if(obj1[name]  === obj2[name].length) {
              alert("match");
          }
      }
      

      【讨论】:

      • 已更新。我以为for(var i in obj1)中的i是一个索引,但它是属性名称的名称。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多