javascript - js判断一个对象是另一个对象的子集
PHP中文网
PHP中文网 2017-04-11 11:50:07
[JavaScript讨论组]

写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性-值对都必须存在于 collection 的对象中。

例如,如果第一个参数是 [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }],第二个参数是 { last: "Capulet" },那么你必须从数组(第一个参数)返回其中的第三个对象,因为它包含了作为第二个参数传递的属性-值对。

where([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "c": 2 }) 应该返回 [{ "a": 1, "b": 2, "c": 2 }]

function where(collection, source) {
  var arr = [];
  // What's in a name?
  return arr;
}
PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(5)
黄舟

我的思路是一个对象数组collection的数组元素item包含相匹配的对象source, 那么在判断key-value的个数是等于source对象中key的个数. 实现代码:

function where(collection, source) {
    
  return collection.filter(function(item) {
    var index = 0;
    for (var key in source) {
      if (item[key] && source[key] === item[key]) {    
        index++;
      }
    }
    return index === Object.keys(source).length;
  });
}

var testCaseArray1 = [{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }],
    testCaseArray2 = [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }];
    
var object1 = { "a": 1, "c": 2 },
    object2 = { last: "Capulet" };

var testCase1 = where(testCaseArray1, object1),
    testCase2 = where(testCaseArray2, object2);

console.log(testCase1);
console.log(testCase2);
迷茫

推荐学一下lodash.js

_.find([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }],{ "a": 1, "c": 2 })
大家讲道理
function where(array, obj) {
    const keys = Object.keys(obj);
    return array.filter(m => {
        return keys.every(key => m.hasOwnProperty(key) && m[key] === obj[key]);
    });
}

const result = where([
    { "a": 1, "b": 2 },
    { "a": 1 },
    { "a": 1, "b": 2, "c": 2 }], { "a": 1, "c": 2 });

console.log(result);
// [ { a: 1, b: 2, c: 2 } ]
PHPz
function where(collection, source) {
  var arr = [];
  var is;
  var sourceName=Object.keys(source);
  for(var i=0;i<collection.length;i++){
    is=true;
    for(var j=0;j<sourceName.length;j++){
      if(collection[i][sourceName[j]]!==source[sourceName[j]]){
         is=false;
         break;       
    }
      
      
    }
    if(is){
         arr.push(collection[i]) ;
      }
  }
  // What's in a name?
  return arr;
}
PHP中文网

filter 筛选两次不就出来了吗

function where(collection, source) {
  var k = Object.keys(source);
  return collection.filter(c=>k.filter(x=>source[x] == c[x]).length == k.length);
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号