首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我有两个数组,如何找到匹配元素并执行一些操作?(送交)

我有两个数组,如何找到匹配元素并执行一些操作?(送交)
EN

Stack Overflow用户
提问于 2015-10-09 09:49:03
回答 4查看 454关注 0票数 3
代码语言:javascript
运行
复制
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无论如何都会进行一次干预。

代码语言:javascript
运行
复制
_.each($scope.array1, function(element1) {
          if(_.some($scope.array2, { ID: element1.ID })) {
            element1.Checked = true;
          }
        });
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-09 21:02:04

使用lodash,使用一个序列,在其中您使用array1创建一个项目映射,使用_.indexBy()。使用array2使用_.pluck()创建一个ids数组,并将它们与_.at()一起使用以获取所选项。使用_.forEach()迭代返回的对象,将Checked属性设置为true,并使用.commit()应用更改:

代码语言:javascript
运行
复制
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, ' ');
代码语言:javascript
运行
复制
<script src="https://cdn.jsdelivr.net/lodash/3.10.1/lodash.min.js"></script>

<pre id="demo"></pre>

票数 1
EN

Stack Overflow用户

发布于 2015-10-09 09:54:15

你必须使用两个循环,因为你有两个随机长度的数组。但是你不需要嵌套它们。根据ID数组创建一个映射,然后检查索引。

代码语言:javascript
运行
复制
var availableIDs = array2.map(function ( item ) { return item.ID; });
array1.forEach(function ( item ) {
    if (availableIDs.indexOf(item.StudentID) !== -1) item.Checked = true;
});
票数 2
EN

Stack Overflow用户

发布于 2015-10-09 10:00:55

使用简单的映射函数,您可以对所有对象进行简单的搜索。

代码语言:javascript
运行
复制
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的数据集,这就足够了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33035090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档