var array1 = [{Age: 24, Name: "Test", StudentID: 101, Checked: false}, {Age:25, Name: "Test", StudentID: 102, Checked: false}];
var array2 = [{ID: 101}];如果array1中的任何元素的属性StudentID等于array2中的ID属性,那么我希望将array1中的Checked属性设置为true。
有小费吗?我想在不编写嵌套_.each语句的情况下这样做。
这是我的第一次拍摄,但是,我相信_.some无论如何都会进行一次干预。
_.each($scope.array1, function(element1) {
          if(_.some($scope.array2, { ID: element1.ID })) {
            element1.Checked = true;
          }
        });发布于 2015-10-09 21:02:04
使用lodash,使用一个序列,在其中您使用array1创建一个项目映射,使用_.indexBy()。使用array2使用_.pluck()创建一个ids数组,并将它们与_.at()一起使用以获取所选项。使用_.forEach()迭代返回的对象,将Checked属性设置为true,并使用.commit()应用更改:
function checkById(items, selected) {
  _(items) // start chained sequence
    .indexBy('StudentID') // create a map of student objects by ids
    .at(_.pluck(selected, 'ID')) // create an array of IDs from the objects in the selected array
    .forEach(function(item) { // change the items Checked to true
      item.Checked = true;
    })
    .commit(); // executes the chained sequence
}
var array1 = [{
  Age: 24,
  Name: "Test1",
  StudentID: 101,
  Checked: false
}, {
  Age: 25,
  Name: "Test2",
  StudentID: 102,
  Checked: false
}, {
  Age: 22,
  Name: "Test3",
  StudentID: 103,
  Checked: false
}, {
  Age: 28,
  Name: "Test4",
  StudentID: 104,
  Checked: false
}];
var array2 = [{
  ID: 101
}, {
  ID: 104
}];
checkById(array1, array2);
console.table(array1);
document.getElementById('demo').innerText = JSON.stringify(array1, null, ' ');<script src="https://cdn.jsdelivr.net/lodash/3.10.1/lodash.min.js"></script>
<pre id="demo"></pre>
发布于 2015-10-09 09:54:15
你必须使用两个循环,因为你有两个随机长度的数组。但是你不需要嵌套它们。根据ID数组创建一个映射,然后检查索引。
var availableIDs = array2.map(function ( item ) { return item.ID; });
array1.forEach(function ( item ) {
    if (availableIDs.indexOf(item.StudentID) !== -1) item.Checked = true;
});发布于 2015-10-09 10:00:55
使用简单的映射函数,您可以对所有对象进行简单的搜索。
var array1 = [{Age: 24, Name: "Test", StudentID: 101, Checked: false}, {Age:25, Name: "Test", StudentID: 102, Checked: false}];
var array2 = [{ID: 101}];
function search(studentList,searchQuery) {
     var results = [];
     studentList.forEach(function(student,sIndex) {
          searchQuery.forEach(function(search,qIndex) {
               if(search.ID == student.StudentID) {
                    results.push(student);
               }
          });       
     })
     return results;
}
search(array1,array2);forEach函数所做的是对每个元素进行迭代,传递它正在迭代的索引的对象以及对象所在的索引。
通过拥有一个双重嵌套映射,可以轻松地遍历对象,然后根据您定义的规则对它们进行比较。
然后,通过使用一个作用域变量,您可以将匹配值推入该数组,从而给出一个很好、干净的结果来返回。
现在请注意,这不是处理这件事最有效的方法。您可以做一个测试,其中数组是最长的,并且有一个迭代时间最少。因此,如果有更多的学生比搜索参数迭代学生一次。如果搜索参数比学生多,请迭代一次搜索参数。
此外,你也可以选择“预先过滤”数组,方法是在你想要排序的索引上对数组进行排序,跳过那些你不需要的数组,比如简单的min/max排除等等。但是,最好使用数据库查询来搜索大量的数据。但是,如果你只有一个大约1000的数据集,这就足够了。
https://stackoverflow.com/questions/33035090
复制相似问题