使用下划线来确定对象是否存在于深层嵌套的对象数组中?

时间:2018-03-04 16:38:10

标签: javascript underscore.js lodash

这种比较有点奇怪,因为我有以下格式:

首选项对象:

{ 
  models: [
   {... attributes: {} },
   {... attributes: {} },
   {... attributes: {} }
  ]
}

数据阵列:

[{}, {}, {}]

我的object包含array更多 objects,其中包含一个名为 属性的密钥

我的目标:

我的目标是使用Underscore.JS查看 数据阵列 中的哪些项目不会作为models数组中属性键的值存在。

Hacky Attempt:

这绝对不是我想要编码的方式,但localStorageLayers数据数组layerPrefs首选项对象是以上标签。

_.each(localStorageLayers, (localLayer) => {
    var layerWasLoaded = false;
    _.each(layerPrefs.models, (layerPref) => {
        if (_.isEqual(layerPref.attributes, localLayer)) {
            layerWasLoaded = true;
            // Don't do anything
        }
    })
    if (layerWasLoaded == false) {
        // Do stuff
    }
})

1 个答案:

答案 0 :(得分:1)

你可以filterlocalStorageLayers向下移动到localLayer被发现等于some个对象的所有(忽略layerPrefs.models)的子集与其attributes属性相比。

我不使用lodash,但result应仅包含localStorageLayers中未找到相等内容的layerPrefs.models



const layerPrefs = { 
  models: [
   {attributes: {foo: "foo"} },
   {attributes: {foo: "bar"} },
   {attributes: {baz: "baz"} }
  ]
};

const localStorageLayers = [
  {foo: "foo"}, {hot: "dog"}, {hot: "dog"}, {baz: "baz"}
];

const result = _.filter(localStorageLayers, localLayer => 
    !_.some(layerPrefs.models, layerPref =>
        _.isEqual(layerPref.attributes, localLayer)
    )
);

console.log(result);

// Remove duplicates
const noDupes = _.uniqBy(result, _.isEqual);

console.log(noDupes);

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>
&#13;
&#13;
&#13;

您可以通过localLayer执行_.every来反转每个!_.isEqual的评估。

使用似乎更清晰。

const result = _.filter(localStorageLayers, localLayer => 
    _.every(layerPrefs.models, layerPref =>
        !_.isEqual(layerPref.attributes, localLayer)
    )
);