从对象列表中,根据另一个列表underscorejs更新属性

时间:2018-01-31 06:36:47

标签: javascript underscore.js

我有一个对象'objlist'列表和一个id'idlist'列表。

var objlist = [{id:1, visible:true},{id:2, visible:false},{id:3, visible:false}];
var idlist = [1, 3];

我希望第一个列表中的对象对第二个列表中的每个ID都具有'visible'值为'true',其余值为'false'。

当我在循环中尝试循环时,我得到的结果不正确。如何获得正确的清单。

我的尝试:

var objlist = [{id:1, visible:true},{id:2, visible:false},{id:3, visible:false}];
var idlist = [1, 3];
_.each(idlist, function(p) {
  _.each(objlist, function(obj) {
    if (obj.id == p) {

      obj.visible = true;

    } else {
      obj.visible = false;
    }
  });
});

console.log(objlist)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

当后续循环中的条件中断时,会发生变化。

5 个答案:

答案 0 :(得分:1)

首先,为什么你的代码不起作用:

您首先在idList上循环,然后在objlist上循环。所以这里的问题是,在每次迭代中,只有一个对象可以对条件成立。因此,最后一个是true

以下是使用下划线的示例:

注意:其他答案已经显示使用vanilla JS的方法,但由于您已经使用了下划线,您可以检查这种方法

&#13;
&#13;
var objlist = [{id:1, visible:true},{id:2, visible:false},{id:3, visible:false}];
var idlist = [1, 3];
_.each(objlist, function(p) {
  p.visible = _.contains(idlist, p.id)
});

console.log(objlist)
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

使用forEachincludes

objlist.forEach( s => (s.visible = idlist.includes( s.id ) ) );

<强>演示

&#13;
&#13;
var objlist = [{id:1, visible:true},{id:2, visible:false},{id:3, visible:false}];
var idlist = [1, 3];

objlist.forEach( s => (s.visible = idlist.includes( s.id ) ) );

console.log(objlist);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以使用array.prototype.maparray.prototype.includes

&#13;
&#13;
var objlist = [{id:1, visible:true},{id:2, visible:false},{id:3, visible:false}];
var idlist = [1, 3];

var result = objlist.map(e => (e.visible = idlist.includes(e.id), e));

console.log(result);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

尝试以下

&#13;
&#13;
var objlist = [{id:1, visible:true},{id:2, visible:false},{id:3, visible:false}];
var idlist = [1, 3];

objlist = objlist.map(function(item){
    item.visible = idlist.indexOf(item.id) !== -1;
    return item;
});

console.log(objlist);
&#13;
&#13;
&#13;

答案 4 :(得分:0)

这很有效。

&#13;
&#13;
var objlist = [{id:1, visible:true},{id:2, visible:false},{id:3, visible:false}];
var idlist = [1, 3];

for(var index in objlist)
{
    var obj = objlist[index];
    obj.visible = idlist.includes(obj.id);
}

console.log(objlist);
&#13;
&#13;
&#13;