javascript从assoc数组中删除(空)数组

javascript从assoc数组中删除(空)数组,javascript,associative-array,Javascript,Associative Array,我有一个assoc js数组,我想从中删除一个元素。 我的解决方案很有效,但不是很好,有更好的解决方案吗 // i got this assoc array var cm = []; cm["a"] = ["a"]; cm["b"] = ["c"]; cm["s"] = ["a", "b", "c"]; cm["x"] = []; console.log(cm); var searchKey = "s"; var p = ["a","c","d", "b"];

我有一个assoc js数组,我想从中删除一个元素。 我的解决方案很有效,但不是很好,有更好的解决方案吗

// i got this assoc array
var cm = [];
    cm["a"] = ["a"];
    cm["b"] = ["c"];
    cm["s"] = ["a", "b", "c"];
    cm["x"] = [];
console.log(cm);

var searchKey = "s";
var p = ["a","c","d", "b"]; // to remove from searchKey array

// remove elements (works fine)
cm[searchKey] = cm[searchKey].filter(value => (p.includes(value) === false));
console.log(cm); // now cm[searchKey] is an empty array

// if the array at index 'searchKey' is empty remove it from assoc array
var newarray = [];
if (cm[searchKey].length===0)
{
    for(key in cm)
  {
    if (key!=searchKey) newarray[key] = cm[key];
  }
}
cm = newarray;
console.log(cm);

我尝试过使用filter和splice,但这两种方法仅适用于阵列,而不适用于assoc阵列。

您有一个对象,因此可以执行以下操作:

if (cm[searchKey].length===0)
{
    delete cm[searchKey]
}

您有一个对象,因此可以执行以下操作:

if (cm[searchKey].length===0)
{
    delete cm[searchKey]
}

你可能需要一张地图。我认为Map做得比你实际要求的更好。

你可能需要Map。我认为Map做得比您实际要求的更好。

这是一个完美的Map用例:

  class Multimap extends Map {
    get(key) {
      return super.get(key) || [];
    }

    addTo(key, value) {
      if(this.has(key)) {
         this.get(key).push(value);
       } else {
         this.set(key, [value]);
       }
    }

    removeFrom(key, value) {
      this.set(key, this.get(key).filter(el => el !== value));
    }
}
这可以用作:

 const cm = new Multimap([
  ["a", ["a", "b", "c"]]
 ]);

 cm.removeFrom("a", "b");
 cm.get("a").includes("b") // false

这是地图的完美用例:

  class Multimap extends Map {
    get(key) {
      return super.get(key) || [];
    }

    addTo(key, value) {
      if(this.has(key)) {
         this.get(key).push(value);
       } else {
         this.set(key, [value]);
       }
    }

    removeFrom(key, value) {
      this.set(key, this.get(key).filter(el => el !== value));
    }
}
这可以用作:

 const cm = new Multimap([
  ["a", ["a", "b", "c"]]
 ]);

 cm.removeFrom("a", "b");
 cm.get("a").includes("b") // false

我在数组上使用了
.filter
,如下所示

// Remove emptys
modeSummary = modeSummary.filter(ms => ms);

我在数组上使用了
.filter
,如下所示

// Remove emptys
modeSummary = modeSummary.filter(ms => ms);

JavaScript没有关联数组。您误用了JS数组类型。
cm
不是关联数组。您不应该这样做-您实际上是在创建一个数组,但只是通过设置其属性将其视为一个对象。你应该使用
cm={}
来实例化一个对象,你似乎想检查和改进你的代码,但是你没有给出“好”或“更好”代码的条件。你是对的,但是上面的部分(assoc数组)是给定的(不要问为什么)孔数组是像对象一样处理的。删除作品@塞巴斯蒂安:是的,
delete
可以。仅仅因为你可以做一些事情并不意味着你应该做。JavaScript没有关联数组。您误用了JS数组类型。
cm
不是关联数组。您不应该这样做-您实际上是在创建一个数组,但只是通过设置其属性将其视为一个对象。你应该使用
cm={}
来实例化一个对象,你似乎想检查和改进你的代码,但是你没有给出“好”或“更好”代码的条件。你是对的,但是上面的部分(assoc数组)是给定的(不要问为什么)孔数组是像对象一样处理的。删除作品@塞巴斯蒂安:是的,
delete
可以。仅仅因为你能做某事并不意味着你应该做。